SQLLab
🔀

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.

CASE внутри COUNT и SUM
-- Количество заказов по категориям в одном запросе
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 — он короче.

Простой 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.

CASE vs COALESCE
-- Оба варианта эквивалентны:
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 позволяет задать нестандартный порядок сортировки — например, сначала «срочные», потом остальные.

Кастомная сортировка через CASE
-- Сначала отменённые заказы, потом остальные по дате
SELECT order_id, status, created_at
FROM orders
ORDER BY
  CASE WHEN status = 'cancelled' THEN 0 ELSE 1 END,
  created_at DESC;

Закрепи знания на практике

Решай реальные задачи с собеседований прямо в браузере — без установки.

Решить задачи с CASE WHEN