2.1 Oświadczenie CASE

Istnieją dwa sposoby napisania instrukcji w języku SQL CASE. Pierwszy wpis sprawia, że ​​wygląda to jak przejście z języka Java, podczas gdy drugi format bardziej przypomina liczbę mnogą if-else.

Zacznijmy od pierwszej opcji - analogu przełącznika. Ogólny format to:

CASE case_value
	WHEN value1 THEN result1
	[WHEN value2 THEN result2] ...
	[ELSE resultN]
END

Naprawdę bardzo podobny do switch, tylko słowa są nieco inne:

SQL Jawa
przypadek x przełącznik (x) {
kiedy wartość wartość przypadku:
potem wynik zwróć wynik;
inny wynik domyślnie: zwróć wynik;
koniec }

Przetłumaczmy przykład z Javy na SQL:

Jawa SQL
switch (a) {
   case 1: return "one";
   case 2: return "two";
   case 3: return "three";
   default: return "unknown";
}
CASE a
   WHEN 1 THEN 'one'
   WHEN 2 THEN 'two'
   WHEN 3 THEN 'three'
   ELSE 'unknown'
END

2.2 Druga wersja oświadczenia CASE

Istnieje również druga wersja operatora CASE, która, jak wspomniano powyżej, jest bardziej podobna do liczby mnogiej if-else. Ogólny format to:

CASE
	WHEN condition 1 THEN result1
	[WHEN condition 2 THEN result2] ...
	[ELSE resultN]
END

Tutaj warunki są po prostu sprawdzane sekwencyjnie, jeśli którykolwiek z nich jest prawdziwy, to określony wynik zostanie zwrócony. Jeśli żaden z warunków nie jest spełniony, wartość określona w ELSE.

Przetłumaczmy przykład z Javy na SQL:

Jawa SQL
if (a == 3)
	return "three";
CASE
   WHEN a=3 THEN 'three'
END
if (a == 3)
	return "three";
else
	return "zero";
CASE
   WHEN a=3 THEN 'three'
   ELSE 'zero'
END
if (a == 1)
	return "three";
else if (a == 2)
	return "two";
else if (a == 3)
	return "three";
else
	return "zero";
CASE
   WHEN a=1 THEN 'one'
   WHEN a=2 THEN 'two'
   WHEN a=3 THEN 'three'
   ELSE 'zero'
END

2.3 Rozwiąż problem za pomocą instrukcji CASE

Zapiszmy jakieś interesujące zapytanie. Pamiętajcie, mieliśmy zadanie - dodać słowo „WAŻNY!” do nazwy przeszłych zadań w tabeli zadań . Można to łatwo zrobić za pomocą CASE.

Dla pola terminu będzie to wyglądać jak druga wersja wyciągu CASE:


CASE
	WHEN deadline < CURDATE() THEN CONCAT('EXPIRED!', name)
	ELSE name
END
        

Przykład kompletnego zapytania z użyciem operatora CASE:


SELECT
    id,
    emploee_id,
    CASE WHEN deadline < CURDATE() THEN CONCAT('EXPIRED!', name) ELSE name END AS name,
    deadline         	
FROM task
        

Wynikiem tego zapytania będzie:

ID identyfikator_pracownika nazwa termin ostateczny
1 1 WYGASŁY! Napraw błąd w interfejsie użytkownika 2022-06-01
2 2 Napraw błąd w backendzie 2022-06-15
3 5 Kup kawę 2022-07-01
4 5 Kup kawę 2022-08-01
5 5 Kup kawę 2022-09-01
6 (ZERO) Posprzątaj biuro (ZERO)
7 4 Ciesz się życiem (ZERO)
8 6 Ciesz się życiem (ZERO)