Перейти до основного вмісту
Модуль 4 · Урок 3 із 415/57 у курсі~10 min
Модульні уроки (3/4)

Умовна логіка: CASE WHEN

Усе, що ми бачили досі, витягує дані як є. Але часто хочеться щоб трансформувати його: класифікувати зарплати за рівнями, позначати нових найнятих як "junior", переведіть числовий код у читабельну позначку. стандарт SQL інструмент для цього називається CASE WHEN.

Синтаксис: міні if/else

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

Він читається точно як if/else if/else будь-якою мовою: SQL обчислює умови за порядком і зупиняється на першому істинному, повертаючи відповідний value. Якщо жодне не є істинним, повертається значення ELSE. Якщо ви опустити ELSE і жодна гілка не відповідає, повертає 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 живе всередині SELECT: він створює стовпець, як і будь-який інший функція, і абсолютно нормально присвоїти їй псевдонім AS (тут tier).

Де використовувати CASE

Три місця, що повторюються:

  1. У SELECT для створення похідних стовпців (приклад вище).
  2. У ORDER BY для "власного" сортування:
    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. Всередині агрегатних функцій для «умовного підрахунку»:
    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) — найпоширеніший "умовний підрахунок", який використовується на інформаційних панелях.

«Компактна» форма

Існує також коротший варіант, коли ви порівнюєте один вираз проти точних значень:

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

Це еквівалентно CASE WHEN department_id = 1 THEN ... WHEN department_id = 2 ПОТІМ ... КІНЕЦЬ, тільки більш компактний. Це працює лише для точної рівності: якщо вам потрібно >= або інше порівняння, вам потрібно повернутися до розширеного форму.

Спробуйте

вправи#sql.m4.l3.e1
Спроби: 0Завантаження…

Для кожного працівника відображайте ім’я (first_name), прізвище (last_name) і стовпець «tier», тобто «Alto», якщо зарплата становить принаймні 50 000, інакше «Standard». Три колонки, по одному рядку на працівника.

Завантаження редактора…
Показати підказку

Умова: зарплата >= 50000. Не забудьте закрити CASE за допомогою END і використати псевдонім 'tier'.

Рішення доступне після 3 спроб

Повторна вправа

вправи#sql.m4.l3.e2
Спроби: 0Завантаження…

Для кожного відділу (department_id) підрахуйте, скільки працівників мають високу зарплату (>= 50000), а скільки стандартну (< 50000), використовуючи SUM(CASE...). Три стовпці: department_id, high, standard. Впорядкувати за department_id (NULLS LAST).

Завантаження редактора…
Показати підказку

Шаблон SUM(CASE WHEN ... THEN 1 ELSE 0 END) є умовним підрахунком.

Рішення доступне після 3 спроб