SQL CASE WHEN: условие и группировка значений

Категория: Postgresql · Язык: SQL · Обновлено:

Выражение CASE WHEN выбирает значение по условиям и работает в SELECT, ORDER BY и агрегатах. Условия проверяются сверху вниз; выполнится ветка первого истинного WHEN, а при отсутствии совпадения вернётся ELSE или NULL.

Преобразовать код в понятную метку

SQL
WITH orders(status) AS (VALUES ('paid'), ('pending'), ('failed'))
SELECT status,
       CASE
         WHEN status = 'paid' THEN 'Оплачен'
         WHEN status = 'pending' THEN 'Ожидает оплаты'
         ELSE 'Другая ошибка'
       END AS label
FROM orders;

Добавляйте ELSE, если нужно избежать неожиданного NULL для новых значений.

Условная агрегация

SQL
WITH orders(status, amount) AS (
  VALUES ('paid', 100), ('pending', 50), ('paid', 25)
)
SELECT COUNT(*) AS all_orders,
       COUNT(CASE WHEN status = 'paid' THEN 1 END) AS paid_orders,
       SUM(CASE WHEN status = 'paid' THEN amount ELSE 0 END) AS paid_total
FROM orders;

В PostgreSQL вместо SUM(CASE...) можно использовать FILTER (WHERE status = 'paid') для агрегатов.

Конструкция

Назначение

CASE WHEN ... THEN ...

Условно вернуть значение

ELSE ...

Значение по умолчанию

COUNT(CASE WHEN ... THEN 1 END)

Посчитать строки, удовлетворяющие условию

SUM(CASE WHEN ... THEN amount ELSE 0 END)

Суммировать значения по условию

Можно ли использовать CASE в WHERE?

Можно, но часто условие проще и понятнее записать через AND/OR. Не оборачивайте индексируемый столбец в выражение без необходимости: это может помешать использованию обычного индекса.