Jeśli już znasz CASE, sposób na wstawianie logiki bezpośrednio do zapytania. Ale nie każdy wie, że CASE ma dwie formy. Jeśli CASE WHEN ... to sprawdzanie warunków w stylu if-else, to prosty CASE to jak switch-case z innych języków: porównuje jedno wyrażenie z kilkoma wartościami i wykonuje odpowiedni blok.
Wygląda to bardziej kompaktowo i intuicyjnie, gdy porównujesz jedno pole z ustalonymi wartościami.
Składnia prostego CASE
CASE expression
WHEN value1 THEN result1
WHEN value2 THEN result2
...
ELSE default_result
END
Wszystko proste:
expression— to wyrażenie lub pole, które porównujesz z wartościamivalue1,value2itd.THENwskazuje, co zwrócić przy trafieniu.ELSE— co zwrócić, jeśli nic nie pasuje (można pominąć, ale lepiej nie).
Przykład: Oceny studentów
Wyobraź sobie tabelę students z kolumną grade, która zawiera liczbę całkowitą od 2 do 5. Chcemy wyświetlić tekstową interpretację ocen.
SELECT
name,
grade,
CASE grade
WHEN 5 THEN 'Celujący'
WHEN 4 THEN 'Bardzo dobry'
WHEN 3 THEN 'Dostateczny'
WHEN 2 THEN 'Niedostateczny'
ELSE 'Nieznane'
END AS ocena_slownie
FROM students;
Tutaj CASE porównuje wartość pola grade z ustalonymi wartościami 2, 3, 4, 5.
Przykład: Kategorie produktów po kodzie
W tabeli products jest pole category_code, gdzie są krótkie etykiety: 'el', 'frn', 'bks' itd. Chcemy wyświetlić czytelną nazwę kategorii.
SELECT
product_name,
category_code,
CASE category_code
WHEN 'el' THEN 'Elektronika'
WHEN 'frn' THEN 'Meble'
WHEN 'bks' THEN 'Książki'
ELSE 'Inne'
END AS category_name
FROM products;
Ten trik jest szczególnie wygodny, gdy trzeba wyświetlić "ludzki" tekst zamiast kodu.
Przykład: Nazwy miesięcy
Czasem chcesz wyświetlić nazwy miesięcy jako tekst po numerze:
SELECT
EXTRACT(MONTH FROM order_date) AS month_number,
CASE EXTRACT(MONTH FROM order_date)
WHEN 1 THEN 'Styczeń'
WHEN 2 THEN 'Luty'
WHEN 3 THEN 'Marzec'
WHEN 4 THEN 'Kwiecień'
WHEN 5 THEN 'Maj'
WHEN 6 THEN 'Czerwiec'
WHEN 7 THEN 'Lipiec'
WHEN 8 THEN 'Sierpień'
WHEN 9 THEN 'Wrzesień'
WHEN 10 THEN 'Październik'
WHEN 11 THEN 'Listopad'
WHEN 12 THEN 'Grudzień'
ELSE 'Nieznane'
END AS month_name
FROM orders;
Tutaj prosty CASE sprawia, że to, co normalnie byłoby liczbami od 1 do 12, staje się czytelne.
Praca z NULL w prostym CASE
Ważne, żeby wiedzieć, że jeśli wartość porównujesz z NULL, to wynik będzie NULL, bo NULL = NULL — to nie jest prawda, tylko nieznane.
Przykład z NULL:
SELECT
user_id,
status,
CASE status
WHEN 'active' THEN 'Aktywny'
WHEN 'blocked' THEN 'Zablokowany'
WHEN NULL THEN 'Brak statusu' -- nie zadziała!
ELSE 'Nieznane'
END AS user_state
FROM users;
Zamiast WHEN NULL lepiej użyć ELSE, albo po prostu zastosować wyszukiwawczy CASE (który omawialiśmy na poprzednim wykładzie):
CASE
WHEN status IS NULL THEN 'Brak statusu'
...
Porównanie z wyszukiwawczym CASE
| Cecha | Prosty CASE | Wyszukiwawczy CASE |
|---|---|---|
| Porównanie z konkretnymi wartościami | ✅ Wygodny | ❌ Nie pasuje |
| Elastyczność warunków (>, IS NULL) | ❌ Nie można | ✅ Można |
| Odpowiednik w programowaniu | switch-case |
if-else |
Praktyczne przypadki
Przykład: Wizualizacja statusu zgłoszenia
| request_id | status |
|---|---|
| 101 | new |
| 102 | in_progress |
| 103 | done |
| 104 | cancelled |
| 105 | NULL |
SELECT
request_id,
CASE status
WHEN 'new' THEN '🟡 Nowe'
WHEN 'in_progress' THEN '🔵 W trakcie'
WHEN 'done' THEN '🟢 Zakończone'
ELSE '⚪ Nieznane'
END AS status_label
FROM requests;
| request_id | status_label |
|---|---|
| 101 | 🟡 Nowe |
| 102 | 🔵 W trakcie |
| 103 | 🟢 Zakończone |
| 104 | ⚪ Nieznane |
| 105 | ⚪ Nieznane |
Tutaj CASE działa jak tłumacz: zamienia techniczne statusy na czytelne (i nawet sympatyczne) etykiety. I jeśli status jest nieznany lub NULL — użytkownik dostanie ⚪ „Nieznane”.
Przykład: Grupowanie po kategoriach do raportu
| employee_id | name | department |
|---|---|---|
| 1 | Alex Lin | HR |
| 2 | Maria Chi | IT |
| 3 | Anna Song | IT |
| 4 | Otto Art | FIN |
| 5 | Jane Doe | HR |
| 6 | Max Gray | SALES |
| 7 | Zoe Black | IT |
| 8 | Tom Brown | FIN |
| 9 | Liam Park | NULL |
| 10 | Eva Gold | HR |
SELECT
CASE department
WHEN 'HR' THEN 'Kadry'
WHEN 'IT' THEN 'Technologie'
WHEN 'FIN' THEN 'Finanse'
ELSE 'Inne'
END AS dept_name,
COUNT(*) AS staff_count
FROM employees
GROUP BY
CASE department
WHEN 'HR' THEN 'Kadry'
WHEN 'IT' THEN 'Technologie'
WHEN 'FIN' THEN 'Finanse'
ELSE 'Inne'
END;
Wynik:
| dept_name | staff_count |
|---|---|
| Kadry | 3 |
| Technologie | 3 |
| Finanse | 2 |
| Inne | 2 |
Co tu się dzieje:
- Pracownicy z działu HR trafiają do kategorii Kadry.
- IT — to Technologie.
- FIN — to Finanse.
- Wszystko inne, w tym SALES i NULL, trafia do Inne. Takie podejście świetnie się sprawdza przy tworzeniu przyjaznych i czytelnych raportów.
Typowe błędy
- Zapomniałeś
ELSE→ dostanieszNULL, jeśli żadna wartość nie pasuje. - Porównujesz z
NULL→ nie działa, użyjIS NULLi wyszukiwawczegoCASE. - Porównujesz niekompatybilne typy → na przykład,
CASE grade WHEN '5'jeśligradeto typ liczbowy.
Prosty CASE — to twoje narzędzie, gdy trzeba porównać jedną wartość z zestawem możliwych. Jest kompaktowy, czytelny i szczególnie przydatny do klasyfikacji tekstowej, wizualizacji, zamiany kodów i wygodnego grupowania.
Jeśli jednak musisz sprawdzać zakresy, NULL lub bardziej złożone warunki — użyj wyszukiwawczego CASE. SQL lubi jasność. A CASE — to twoje narzędzie, żeby nadać tej jasności formę.
GO TO FULL VERSION