SQL·Средний·10 мин
CASE WHEN — условная логика в SQL
Условные выражения CASE WHEN — как заменить if/else прямо в SELECT.
CASE WHEN — условная логика в SQL
CASE WHEN — это IF/ELSE в SQL. Без него невозможно делать категоризацию, сегментацию, бизнес-правила.
Базовый синтаксис
SELECT
name,
salary,
CASE
WHEN salary < 100000 THEN 'Junior'
WHEN salary < 200000 THEN 'Middle'
WHEN salary < 400000 THEN 'Senior'
ELSE 'Lead'
END AS level
FROM employees;
Правила:
- Проверяются СВЕРХУ ВНИЗ — первое совпадение выигрывает
ELSE— что если ни одно условие не сработалоEND— обязателен в конце
CASE WHEN в GROUP BY (сегментация)
SELECT
CASE
WHEN age < 25 THEN '18-24'
WHEN age < 35 THEN '25-34'
WHEN age < 45 THEN '35-44'
ELSE '45+'
END AS age_group,
COUNT(*) AS users
FROM users
GROUP BY age_group
ORDER BY age_group;
CASE WHEN в SUM — conditional aggregation
Классика. Считаем сколько premium-юзеров и total в одном запросе:
SELECT
COUNT(*) AS total,
SUM(CASE WHEN tier = 'premium' THEN 1 ELSE 0 END) AS premium_count,
AVG(CASE WHEN tier = 'premium' THEN revenue ELSE NULL END) AS premium_avg_revenue
FROM users;
SUM(CASE) ≡ COUNT(*) WHERE для одного условия — гибче.
Простая форма (только сравнение =)
Когда сравниваем одну колонку с разными значениями:
CASE status
WHEN 'new' THEN 'Новый'
WHEN 'paid' THEN 'Оплачен'
WHEN 'shipped' THEN 'Отправлен'
ELSE 'Неизвестно'
END
Короче чем полная форма.
CASE WHEN в ORDER BY
Кастомная сортировка:
SELECT name, status
FROM orders
ORDER BY
CASE status
WHEN 'urgent' THEN 1
WHEN 'normal' THEN 2
WHEN 'low' THEN 3
END,
created_at DESC;
Pivot-таблица одним запросом
Месячная выручка как столбцы:
SELECT
SUM(CASE WHEN month = 1 THEN sales END) AS jan,
SUM(CASE WHEN month = 2 THEN sales END) AS feb,
SUM(CASE WHEN month = 3 THEN sales END) AS mar
FROM monthly_sales
WHERE year = 2025;
Что важно запомнить
CASE— основа любой бизнес-логики в SQL- Без
ELSE→ возвращаетNULLесли ничего не подошло - Проверка по порядку: ставь самые узкие условия сверху
SUM(CASE WHEN x THEN 1 ELSE 0 END)≡ счёт по условию- На собеседовании: «как посчитать count по нескольким категориям одним запросом» —
CASEв SUM