← К списку уроков
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