Przejdź do głównej treści
eLearner.app
Moduł 4 · Lekcja 3 z 415/57 w kursie~10 min
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

SQL
CASE
  WHEN condition_1 THEN value_1
  WHEN condition_2 THEN value_2
  ...
  ELSE default_value
END

Brzmi 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.

SQL
-- 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:

  1. W SELECT, aby utworzyć kolumny pochodne (przykład powyżej).
  2. W ORDER BY dla sortowania „niestandardowego”:
    SQL
    ORDER BY CASE department_id WHEN 1 THEN 0 ELSE 1 END, last_name;
    -- Engineering first, then the rest, alphabetically by last name.
  3. Wewnętrzne funkcje agregujące do „liczenia warunkowego”:
    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;
    Ten wzorzec — 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:

SQL
CASE department_id
  WHEN 1 THEN 'Ingegneria'
  WHEN 2 THEN 'Vendite'
  ELSE       'Altro'
END

Jest 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

Ćwiczenie#sql.m4.l3.e1
Próby: 0Ładowanie...

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.

Ładowanie edytora...
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

Ćwiczenie#sql.m4.l3.e2
Próby: 0Ładowanie...

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).

Ładowanie edytora...
Pokaż wskazówkę

Wzorzec SUM(CASE WHEN... THEN 1 ELSE 0 END) jest licznikiem warunkowym.

Rozwiązanie dostępne po 3 próbach