Короткий ответ
Конструкция CASE последовательно проверяет условия WHEN и возвращает значение для первого истинного условия. Если ни одно условие не подошло, используется ELSE или возвращается NULL.
Как это работает подробнее
Порядок ветвей важен: после первого совпадения остальные не рассматриваются. Поэтому диапазоны лучше задавать от частного к общему или как ясные непересекающиеся интервалы.
Полученный псевдоним можно использовать как категорию в последующем запросе. Для агрегации без повторения выражения удобно сначала вычислить группу в CTE, а затем выполнить GROUP BY age_group.
Пример кода
query.sql
SELECT
customer_id,
CASE
WHEN age IS NULL THEN 'неизвестно'
WHEN age < 0 OR age > 120 THEN 'ошибка данных'
WHEN age < 18 THEN 'до 18'
WHEN age < 35 THEN '18-34'
WHEN age < 55 THEN '35-54'
ELSE '55+'
END AS age_group
FROM customers;Что использовать на практике
- Явно обработайте NULL. Выделите неизвестный возраст в отдельную группу, а не смешивайте его с группой старшего возраста.
- Проверьте границы. Все допустимые значения должны попадать ровно в один интервал.
Подводные камни
- Перекрытия. Более широкое условие, записанное раньше, сделает следующую ветвь недостижимой.
- Аномалии. Отрицательный возраст или слишком большое значение не должны автоматически попадать в обычную группу.