Lekcje modułu (3/4)
Logika warunkowa: CASE WHEN
Wszystko, co widzieliśmy do tej pory, wyodrębnia dane w niezmienionej postaci. Często jednak chcesz
aby go przekształcić: podziel wynagrodzenia na poziomy, oznacz nowych pracowników jako
„junior”, przetłumacz kod numeryczny na czytelną etykietę. Standard SQL
narzędzie do tego nazywa się CASE WHEN.
Składnia: mini if/else
CASE
WHEN condition_1 THEN value_1
WHEN condition_2 THEN value_2
...
ELSE default_value
ENDBrzmi dokładnie jak if/else if/else w dowolnym języku: SQL ocenia
warunki w kolejności i zatrzymuje się na pierwszym prawdziwym, zwracając
odpowiedni value. Jeśli żadna nie jest prawdziwa, zwraca wartość ELSE. Jeśli ty
pomiń ELSE i nie dopasuj żadnych gałęzi, zwraca NULL.
-- Classify employees by salary tier:
SELECT first_name,
last_name,
salary,
CASE
WHEN salary >= 50000 THEN 'Senior'
WHEN salary >= 35000 THEN 'Mid'
ELSE 'Junior'
END AS tier
FROM employees;CASE żyje wewnątrz SELECT: tworzy kolumnę taką samą jak każda inna
funkcję i jest całkowicie normalne nadanie jej aliasu za pomocą AS (tutaj
KODEF3).
Gdzie używać CASE
Trzy powtarzające się miejsca:
- W
SELECT, aby utworzyć kolumny pochodne (przykład powyżej). - W
ORDER BYdla sortowania „niestandardowego”:SQLORDER BY CASE department_id WHEN 1 THEN 0 ELSE 1 END, last_name; -- Engineering first, then the rest, alphabetically by last name. - Wewnętrzne funkcje agregujące do „liczenia warunkowego”:
Ten wzorzec —SQL
SELECT COUNT(*) AS total, SUM(CASE WHEN salary >= 50000 THEN 1 ELSE 0 END) AS senior, SUM(CASE WHEN salary < 35000 THEN 1 ELSE 0 END) AS junior FROM employees;SUM(CASE WHEN … THEN 1 ELSE 0 END)— jest najczęstszy „liczenie warunkowe” używane w pulpitach nawigacyjnych.
„Kompaktowa” forma
Istnieje również krótszy wariant, gdy porównujesz pojedyncze wyrażenie względem dokładnych wartości:
CASE department_id
WHEN 1 THEN 'Ingegneria'
WHEN 2 THEN 'Vendite'
ELSE 'Altro'
ENDJest odpowiednikiem CASE WHEN department_id = 1 THEN ... WHEN department_id = 2 THEN ... END, tylko bardziej kompaktowy. Działa tylko dla dokładnej równości: if
potrzebujesz >= lub innego porównania, musisz wrócić do wersji rozszerzonej
forma.
Spróbuj
Dla każdego pracownika podaj imię (imię), nazwisko (nazwisko) i kolumnę „poziom”, czyli „Alto”, jeśli wynagrodzenie wynosi co najmniej 50000, w przeciwnym razie „Standard”. Trzy kolumny, jeden wiersz na pracownika.
Pokaż wskazówkę
Warunkiem jest wynagrodzenie >= 50000. Pamiętaj o zamknięciu CASE z END i użyciu aliasu 'tier'.
Rozwiązanie dostępne po 3 próbach
Przejrzyj ćwiczenie
Dla każdego działu (department_id) policz ilu pracowników ma wysoką pensję (>= 50000), a ilu standardową (< 50000) za pomocą SUM(CASE...). Trzy kolumny: identyfikator_działu, wysoki, standardowy. Zamawiaj według identyfikatora działu (NULLS LAST).
Pokaż wskazówkę
Wzorzec SUM(CASE WHEN... THEN 1 ELSE 0 END) jest licznikiem warunkowym.
Rozwiązanie dostępne po 3 próbach