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.
Witam,
mam pytanie jak zsumować w czwartej kolumnie trzy kolumny powstałe za pomocą case?
Pozdrawiam
EŁ
najprościej case when zrobić w podzapytaniu, wtedy zewnętrzne zapytanie może korzystać z wyników. Jeśli to ma być w jednym, to suma musiałaby być kopią 3 case when. Niestety żadna kolumna w SELECT nie zna wyniku innej kolumny