УРОК 10 / 27· ≈ 25 мин

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. Тест 1 — Что вернёт CASE, если ни одно условие WHEN не подошло, а ELSE не указан?
  2. Тест 2 — range = 12000. Что вернёт «CASE WHEN range >= 5000 THEN 'A' WHEN range >= 10000 THEN 'B' ELSE 'C' END»?
  3. Задача 1 — Класс дальности самолёта
  4. Задача 2 — Самолёты по классам дальности
  5. Задача 3 — Вылетел или нет
  6. Задача 4 — Места по классам в одной строке
  7. Задача 5 — Доля бизнес-мест в самолёте

Задачи решаются прямо здесь, в браузере, на учебной базе — нужна только бесплатная регистрация, чтобы сохранялись ответы и прогресс.

Зарегистрироваться и решитьВойти

Потренируйтесь в тренажёре

3

Задачи на ту же тему, но на другой базе — продажи магазина электроники. Хороший способ проверить, что тема понятна, а не просто запомнилась на примерах урока.

Фильтрация групп: HAVINGСледующий урок: NULL, COALESCE и NULLIF