CASE в PostgreSQL - подробная шпаргалка¶
CASE - одно из самых универсальных и недооценённых выражений в PostgreSQL.
С его помощью можно реализовывать условную логику прямо внутри SQL: без процедур, без IF, без лишних JOIN.
В PostgreSQL существует два синтаксических варианта CASE:
- CASE с выражением (simple CASE)
- CASE без выражения (searched CASE)
Они похожи внешне, но решают разные задачи.
1. CASE с выражением (simple CASE)¶
Синтаксис¶
CASE <expression>
WHEN <value_1> THEN <result_1>
WHEN <value_2> THEN <result_2>
...
ELSE <default_result>
END
Пример:¶
CASE status
WHEN 'new' THEN 'Новый'
WHEN 'in_progress' THEN 'В работе'
WHEN 'done' THEN 'Завершён'
ELSE 'Неизвестно'
END
Как это работает¶
<expression>вычисляется один раз- каждый
WHEN- это проверка на равенство
Фактически PostgreSQL делает примерно следующее:
Когда использовать simple CASE¶
✔️ Маппинг значений ✔️ Статусы ✔️ Коды, типы, категории ✔️ Справочники
Пример из практики:
2. CASE без выражения (searched CASE)¶
Синтаксис¶
CASE
WHEN <condition_1> THEN <result_1>
WHEN <condition_2> THEN <result_2>
...
ELSE <default_result>
END
Пример¶
CASE
WHEN amount < 0 THEN 'Отрицательное'
WHEN amount = 0 THEN 'Ноль'
WHEN amount > 0 THEN 'Положительное'
ELSE 'Ошибка'
END
Как это работает¶
- каждый WHEN - логическое выражение
- условия могут быть любой сложности
Допустимо всё:
Когда использовать searched CASE¶
✔️ Диапазоны значений ✔️ Сложные бизнес-правила ✔️ Несколько колонок в условии ✔️ Комбинированная логика ✔️ Аналитические запросы
Пример:
CASE
WHEN amount > 1000 AND region = 'EU' THEN 'Крупный заказ'
WHEN amount > 500 THEN 'Средний заказ'
ELSE 'Малый заказ'
END
3. Частая ошибка новичков ❌¶
Попытка использовать условие в simple CASE:
❌ Это не сработает, потому что:
* WHEN ожидает значение, а не условие
* фактически это читается как:
Правильный вариант ✔️¶
4. CASE всегда возвращает одно значение¶
CASE - это выражение, а не оператор управления потоком.
❗ Он обязан вернуть одно значение для строки.
5. Тип результата CASE¶
Тип результата определяется по всем THEN и ELSE.
➡ тип:integer
❌ Ошибка типов:
PostgreSQL попытается привести типы → ошибка
✔️ Решение - явное приведение:
или6. ELSE необязателен (но опасен)¶
Если ни одно условие не сработает → вернётся NULL.
💡 Рекомендация:
Всегда явно писать ELSE, если NULL не является ожидаемым результатом.
7. Порядок WHEN имеет значение ❗¶
Проверка идёт сверху вниз.
Как только найдено первое совпадение - CASE завершается.
❌ Ошибка:
amount > 100 никогда не выполнится.
✔️ Правильно:
8. CASE внутри агрегатных функций¶
Очень частый и мощный паттерн 💡
Условная агрегация¶
или короче:
Сумма по условию¶
9. CASE в WHERE и ORDER BY¶
В WHERE¶
В ORDER BY¶
10. Практическая рекомендация¶
- Используй CASE с выражением - для маппинга значений
- Используй CASE без выражения - для логики и правил
- Не бойся длинных CASE - они читаемее вложенных IF
- Следи за типами
- Помни про порядок WHEN
Краткое резюме¶
- В PostgreSQL два разных CASE
- Они решают разные задачи
- Ошибки чаще всего связаны с выбором неправильного синтаксиса
- CASE отлично работает с агрегатами и аналитикой
- Это один из ключевых инструментов в SQL-мышлении
📌 Совет из практики
Если логика начинает усложняться, почти всегда нужен CASE без выражения.
simple CASE оставляй для чистого и аккуратного маппинга.