CASE WHEN в SQL
CASE WHEN — условное выражение в SQL, аналог if-else. Позволяет прямо в запросе задавать логику: категоризировать значения, заменять NULL, считать метрики по условию.
Содержание
Базовый синтаксис CASE WHEN
CASE проходит условия по порядку и возвращает значение первого совпавшего. Если ни одно не совпало — возвращает значение ELSE (или NULL если ELSE не указан).
-- Категория по сумме заказа
SELECT
order_id,
amount,
CASE
WHEN amount >= 10000 THEN 'Крупный'
WHEN amount >= 3000 THEN 'Средний'
ELSE 'Мелкий'
END AS size_category
FROM orders;CASE в агрегатных функциях
Мощный паттерн: CASE внутри COUNT или SUM считает только строки, удовлетворяющие условию. Аналог Excel COUNTIF / SUMIF.
-- Количество заказов по категориям в одном запросе
SELECT
COUNT(*) AS total,
COUNT(CASE WHEN amount >= 10000 THEN 1 END) AS large,
COUNT(CASE WHEN amount < 10000
AND amount >= 3000 THEN 1 END) AS medium,
SUM(CASE WHEN status = 'cancelled'
THEN amount ELSE 0 END) AS cancelled_revenue
FROM orders;Простой CASE (сравнение с одним значением)
Если сравниваешь одну колонку с несколькими конкретными значениями, можно использовать простой CASE — он короче.
-- Перевод кода статуса в текст
SELECT
order_id,
CASE status
WHEN 'new' THEN 'Новый'
WHEN 'paid' THEN 'Оплачен'
WHEN 'shipped' THEN 'Отправлен'
WHEN 'cancelled' THEN 'Отменён'
ELSE 'Неизвестно'
END AS status_label
FROM orders;CASE для замены NULL
CASE удобен для подстановки значения по умолчанию вместо NULL. Также для этого есть COALESCE — короче если просто заменяешь NULL.
-- Оба варианта эквивалентны:
SELECT
CASE WHEN phone IS NULL THEN 'Не указан' ELSE phone END AS phone,
COALESCE(phone, 'Не указан') AS phone_coalesce
FROM users;CASE в ORDER BY
CASE в ORDER BY позволяет задать нестандартный порядок сортировки — например, сначала «срочные», потом остальные.
-- Сначала отменённые заказы, потом остальные по дате
SELECT order_id, status, created_at
FROM orders
ORDER BY
CASE WHEN status = 'cancelled' THEN 0 ELSE 1 END,
created_at DESC;Закрепи знания на практике
Решай реальные задачи с собеседований прямо в браузере — без установки.
Решить задачи с CASE WHEN →