SQL CASE WHEN: условие и группировка значений
Выражение CASE WHEN выбирает значение по условиям и работает в SELECT, ORDER BY и агрегатах. Условия проверяются сверху вниз; выполнится ветка первого истинного WHEN, а при отсутствии совпадения вернётся ELSE или NULL.
Преобразовать код в понятную метку
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 для новых значений.
Условная агрегация
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 в WHERE?
Можно, но часто условие проще и понятнее записать через AND/OR. Не оборачивайте индексируемый столбец в выражение без необходимости: это может помешать использованию обычного индекса.