Język SQL: Instrukcja Case

article-thumbnail

Przypadki (z ang. Case) są alternatywą wobec instrukcji warunkowej. W standardowych językach programowa takich jak C++, Javascript czy PHP łączone są ze słowem switch, którego jednak nie znajdziemy w SQL’u. Ich zadaniem jest sterowanie wykonaniem kwerendy. Służą do wyboru określonej drogi postępowania, na podstawie otrzymanej wartości. Dla lepszego zrozumienia logiki tego elementu języka SQL, zapraszam do zapoznania się z wpisem z cyklu teoria programowania, poświęconemu właśnie warunkom logicznym. LINK

Aby stworzyć tą konstrukcję użyjemy słowa kluczowego CASE. Następnie określone warunki poprzedzimy słowem WHEN, a polecenia, które na nie odpowiedzą słowem THEN.Cały syntax wygląda więc tak:

CASE column_name
           WHEN value1 THEN result1
           WHEN value2 THEN result2
           ...
           ELSE result
       END

CASE możemy umieścić w procedurze albo nawet w kwerendzie. Spójrzmy na ten drugi przypadek. Załóżmy ze piszemy skrypt który ma zliczyć płcie po peselu. Będzie wyglądał on tak:

SELECT 
	CASE 
    	WHEN RIGHT(studenci.pesel, 2) % 2 = 0 THEN 'Kobieta' 
        WHEN RIGHT(studenci.pesel, 2) % 2 = 1 THEN 'Mężczyzna' 
    END AS `plec`, 
    COUNT(*) AS liczba_osob 
FROM studenci 
GROUP BY `plec`; 

Dla porównania oto kod, który zrobi to samo, ale bez użycia instrukcji CASE.

SELECT 'Kobiety' AS `plec`, COUNT(`pesel`) AS `ilosc` FROM `studenci` 
	WHERE RIGHT(`pesel`, 2) % 2 = 0 
UNION 
SELECT 'Mężczyźni' AS `plec`, COUNT(`pesel`) AS `ilosc` FROM `studenci` 
	 WHERE RIGHT(`pesel`, 2) % 2 = 1; 

Jak widać, dzięki instrukcji warunkowej możemy zmienić łączenie dwóch kwerend na jedną. Moim zdaniem taki zapis (z użyciem CASE) jest trochę ładniejszy (bardziej czytelny i zrozumiały). Porównajmy czasy wykonania obu zapytań. Dla zapisu z UNION otrzymujemy wynik 0,0010s, a zapis używający CASE wykonał się w 0,0008s.