CodeGym /Kursy /SQL SELF /Wyrażenia warunkowe: CASE <wyrażenie> WHEN ... THEN ... ...

Wyrażenia warunkowe: CASE <wyrażenie> WHEN ... THEN ... ELSE ... END

SQL SELF
Poziom 10, Lekcja 1
Dostępny

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ściami value1, value2 itd.
  • THEN wskazuje, 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 → dostaniesz NULL, jeśli żadna wartość nie pasuje.
  • Porównujesz z NULL → nie działa, użyj IS NULL i wyszukiwawczego CASE.
  • Porównujesz niekompatybilne typy → na przykład, CASE grade WHEN '5' jeśli grade to 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ę.

2
Zadanie
SQL SELF, poziom 10, lekcja 1
Niedostępne
Przypisywanie opisów tekstowych do ocen
Przypisywanie opisów tekstowych do ocen
2
Zadanie
SQL SELF, poziom 10, lekcja 1
Niedostępne
Porównanie kategorii produktów
Porównanie kategorii produktów
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION