Podczas tworzenia zapytań poza pobieraniem wartości bezpośrednio z kolumny mamy możliwość jej wyliczenia. Mogą to być proste lub bardziej skomplikowane obliczenia. Zdarzają się jednak przypadki, gdy wartości w kolumnie wynikowej ma kilka algorytmów, które ją wyliczają.

Funkcja CASE pozwala nam na sterowanie tym, w jaki sposób zostanie wyliczony nasz wynik. Prościej mówiąc jest to taki IF tyle, że w instrukcji SELECT.

Warunki można tworzyć w ten sam sposób co w klauzurze WHERE. Składnia dla sprawdzania różnych wartości w pojedynczym elemencie prezentuje się w następujący sposób:

CASE kolumna/zmienna
    WHEN  wartość1 THEN rezultat1
    WHEN wartość2 THEN rezultat2
    …
    ELSE domyślny_rezultat
END

Po co nam to i kiedy używać? Jeśli dla konkretnych wartości w danej kolumnie/zmiennej chcemy zmienić wartość wynikową. Np. chcielibyśmy drukować miesiące w języku polskim, które zostały wyliczone na podstawie daty sprzedaży:

SELECT CASE MONTH(DataSprzedazy)
        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ń'
    END AS Miesiac
FROM Sprzedaz

Takie działanie wyciągnie numer miesiąca z kolumny DataSprzedazy i dla każdego wiersza pokaże wartość ze słowną nazwą.


Jeśli chcemy sprawdzać warunki, wtedy składnia CASE wygląda tak:

CASE WHEN warunek1 THEN rezultat1
    WHEN warunek2 THEN rezultat2
    …
    ELSE domyślny_rezultat
END

Bardzo prostym przykładem może być określenie płci pracowników na podstawie imienia. Polskie imiona kobiet poza kilkoma wyjątkami kończą się na literę a, zatem:

SELECT Imie,
    CASE WHEN RIGHT(Imie, 1) = 'a'
        THEN Kobieta
        ELSE Mężczyzna
    END Plec
FROM Osoby

Jako wynik otrzymamy kolumnę z imionami, a w drugiej kolumnie płeć osoby wyznaczoną na podstawie imienia.

Tak jak w przypadku instrukcji IF, tutaj ELSE też jest opcjonalny i podajemy w nim wynik, który ma zostać zwrócony, gdy żaden z warunków nie zostanie spełniony. W sytuacji braku ELSE i niespełnienia żadnego warunku pojawi się NULL.

Należy pamiętać, że jeśli rozpoczynamy instrukcję CASE musimy zakończyć ją END. Jest to bardzo często popełniany błąd nie tylko u początkujących. Co gorsza otrzymywany błąd nie naprowadza w żaden sposób na rozwiązanie problemu. Polecam pisać CASE END i później pomiędzy tymi słowami kluczowymi uzupełnić pozostałą część instrukcji.

Dołącz do newslettera już dziś!
Zero spamu - tylko wartościowe treści!
Musisz już lecieć?
Zostaw swój adres e-mail i dołącz do BEZPŁATNYCH WEBINARÓW dotyczących SQLa!
  • „Jak uczyć się SQLa?” – 4 października
  • „SQL dla testerów” – 12 października