Модульні уроки (3/4)
Умовна логіка: CASE WHEN
Усе, що ми бачили досі, витягує дані як є. Але часто хочеться
щоб трансформувати його: класифікувати зарплати за рівнями, позначати нових найнятих як
"junior", переведіть числовий код у читабельну позначку. стандарт SQL
інструмент для цього називається CASE WHEN.
Синтаксис: міні if/else
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.
-- 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
Три місця, що повторюються:
- У
SELECTдля створення похідних стовпців (приклад вище). - У
ORDER BYдля "власного" сортування:SQLORDER BY CASE department_id WHEN 1 THEN 0 ELSE 1 END, last_name; -- Engineering first, then the rest, alphabetically by last name. - Всередині агрегатних функцій для «умовного підрахунку»:
Цей шаблон —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)— найпоширеніший "умовний підрахунок", який використовується на інформаційних панелях.
«Компактна» форма
Існує також коротший варіант, коли ви порівнюєте один вираз проти точних значень:
CASE department_id
WHEN 1 THEN 'Ingegneria'
WHEN 2 THEN 'Vendite'
ELSE 'Altro'
ENDЦе еквівалентно CASE WHEN department_id = 1 THEN ... WHEN department_id = 2 ПОТІМ ... КІНЕЦЬ, тільки більш компактний. Це працює лише для точної рівності: якщо
вам потрібно >= або інше порівняння, вам потрібно повернутися до розширеного
форму.
Спробуйте
Для кожного працівника відображайте ім’я (first_name), прізвище (last_name) і стовпець «tier», тобто «Alto», якщо зарплата становить принаймні 50 000, інакше «Standard». Три колонки, по одному рядку на працівника.
Показати підказку
Умова: зарплата >= 50000. Не забудьте закрити CASE за допомогою END і використати псевдонім 'tier'.
Рішення доступне після 3 спроб
Повторна вправа
Для кожного відділу (department_id) підрахуйте, скільки працівників мають високу зарплату (>= 50000), а скільки стандартну (< 50000), використовуючи SUM(CASE...). Три стовпці: department_id, high, standard. Впорядкувати за department_id (NULLS LAST).
Показати підказку
Шаблон SUM(CASE WHEN ... THEN 1 ELSE 0 END) є умовним підрахунком.
Рішення доступне після 3 спроб