CASE: условия внутри запроса
CASE — «если…, то…» прямо в запросе
До сих пор запрос мог только показать значения столбцов или посчитать по ним итог. Но часто нужно превратить значение в категорию: «дальнемагистральный самолёт» или «ближнемагистральный», «вылетел вовремя» или «с задержкой». Для этого есть выражение CASE:
SELECT airplane_code, model, range,
CASE
WHEN range >= 10000 THEN 'дальнемагистральный'
WHEN range >= 5000 THEN 'среднемагистральный'
ELSE 'ближнемагистральный'
END AS range_class
FROM airplanes;
База проверяет условия WHEN сверху вниз и берёт значение из первого подходящего. Если ни одно не подошло — значение из ELSE. Если ELSE нет — результат NULL.
CASE внутри агрегата — главный приём аналитика
Самое полезное применение CASE — условный подсчёт. Например, сколько в каждом самолёте мест эконом- и бизнес-класса — в одной строке:
SELECT airplane_code,
SUM(CASE WHEN fare_conditions = 'Economy' THEN 1 ELSE 0 END) AS economy,
SUM(CASE WHEN fare_conditions = 'Business' THEN 1 ELSE 0 END) AS business
FROM seats
GROUP BY airplane_code;
Так строят сводные таблицы, считают доли («сколько процентов возвратов») и конверсии. На тестовых заданиях этот приём встречается почти всегда.
Типичные ошибки
- Забытый END. Каждый
CASEзаканчивается словомEND; без него — ошибка синтаксиса. - Порядок условий. Если первым написать
WHEN range >= 5000, самолёт с дальностью 12 000 туда и попадёт, до проверки>= 10000дело не дойдёт. Пишите условия от узкого к широкому. - Разные типы в ветках. Все
THENиELSEдолжны возвращать значения одного типа: нельзя в одной ветке вернуть текст, а в другой — число.
Практика
7- Тест 1 — Что вернёт CASE, если ни одно условие WHEN не подошло, а ELSE не указан?
- Тест 2 — range = 12000. Что вернёт «CASE WHEN range >= 5000 THEN 'A' WHEN range >= 10000 THEN 'B' ELSE 'C' END»?
- Задача 1 — Класс дальности самолёта
- Задача 2 — Самолёты по классам дальности
- Задача 3 — Вылетел или нет
- Задача 4 — Места по классам в одной строке
- Задача 5 — Доля бизнес-мест в самолёте
Задачи решаются прямо здесь, в браузере, на учебной базе — нужна только бесплатная регистрация, чтобы сохранялись ответы и прогресс.
Потренируйтесь в тренажёре
3Задачи на ту же тему, но на другой базе — продажи магазина электроники. Хороший способ проверить, что тема понятна, а не просто запомнилась на примерах урока.