Уроки модуля (3/4)
Условная логика: СЛУЧАЙ, КОГДА
Все, что мы видели до сих пор, извлекает данные как есть. Однако часто хочется
трансформировать его: классифицировать зарплаты по уровням, отмечать новых сотрудников как
«младший», переведите цифровой код в читаемую этикетку. стандарт 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 THEN...END, просто компактнее. Это работает только для точного равенства: если
вам нужно >= или другое сравнение, вам придется вернуться к расширенному
форма.
Попробуйте это
Для каждого сотрудника укажите имя (first_name), фамилию (last_name) и столбец «Уровень», который имеет значение «Альто», если зарплата составляет не менее 50 000, в противном случае — «Стандарт». Три столбца, по одной строке на каждого сотрудника.
Показать подсказку
Условие: зарплата >= 50000. Не забудьте закрыть CASE с помощью END и использовать псевдоним «уровень».
Решение доступно после 3 попыток
Обзор упражнения
Для каждого отдела (department_id) подсчитайте, сколько сотрудников имеют высокую зарплату (>= 50000) и сколько стандартную (< 50000), используя SUM(CASE...). Три столбца: Department_id, высокий, стандартный. Упорядочить по Department_id (NULLS LAST).
Показать подсказку
Шаблон SUM(CASE WHEN ... THEN 1 ELSE 0 END) представляет собой условный подсчет.
Решение доступно после 3 попыток