Выражения CASE в SELECT
Пишите встроенную условную логику и разбирайте поисковую и простую формы CASE.
«Выражения CASE в SELECT» — бесплатный урок SQL Interview Prep на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения SQL Interview Prep, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс SQL Interview Prep содержит 4 уроков всего.
CASE: условное выражение SQL
CASE — это конструкция «если/то/иначе» в SQL, но это выражение, возвращающее одно значение, поэтому оно работает везде, где допустимо значение: в SELECT, WHERE, ORDER BY и даже внутри агрегатных функций.
SELECT order_id,
amount,
CASE WHEN amount > 100 THEN 'large' ELSE 'small' END AS size
FROM orders;Форма CASE с условиями поиска
Поисковая форма CASE проверяет логическое условие для каждого WHEN и возвращает результат первого совпадения. Это наиболее гибкая форма, и порядок имеет значение: срабатывает первое истинное условие.
SELECT score,
CASE
WHEN score >= 90 THEN 'A'
WHEN score >= 80 THEN 'B'
WHEN score >= 70 THEN 'C'
ELSE 'F'
END AS grade
FROM exam_results;Простая форма CASE
Простая форма CASE сравнивает одно выражение со списком значений. Она короче для проверок на равенство, но не умеет работать с диапазонами или проверками NULL.
SELECT status_code,
CASE status_code
WHEN 1 THEN 'active'
WHEN 2 THEN 'paused'
WHEN 3 THEN 'closed'
ELSE 'unknown'
END AS status_label
FROM accounts;Поисковая и простая формы: когда какую использовать
Используйте простую форму CASE для сравнения на равенство с фиксированными значениями, а поисковую форму CASE — для диапазонов или NULL. Важная ловушка: простая форма CASE никогда не сопоставит NULL — используйте IS NULL в поисковой форме.
-- Simple CASE will NOT catch NULL here
SELECT CASE WHEN bonus IS NULL THEN 'no bonus'
ELSE 'has bonus'
END AS bonus_flag
FROM employees;Порядок ветвей WHEN имеет значение
Поскольку срабатывает первая подходящая ветвь, располагайте WHEN от самых специфичных условий к самым общим. Если сначала поставить слишком общий порог, оценка 95 будет помечена неправильно.
-- Correct order: highest threshold first
SELECT CASE
WHEN score >= 90 THEN 'A'
WHEN score >= 80 THEN 'B'
ELSE 'C or below'
END AS grade
FROM exam_results;ELSE и неявный NULL
Если ни одно условие не совпало и Вы пропустили ELSE, CASE возвращает NULL. Добавляйте явный ELSE со значением по умолчанию, чтобы неожиданные значения незаметно не превращались в NULL.
-- No ELSE: anything not 1/2 becomes NULL
SELECT CASE flag WHEN 1 THEN 'yes' WHEN 2 THEN 'no' END AS label
FROM toggles;Условная агрегация (шаблон сводной таблицы)
Самый ценный приём на собеседовании — условная агрегация. Поместите CASE внутрь SUM или COUNT, чтобы за один проход подсчитать строки по категориям и получить аккуратный отчёт в стиле сводной таблицы.
SELECT
SUM(CASE WHEN status = 'paid' THEN 1 ELSE 0 END) AS paid_orders,
SUM(CASE WHEN status = 'pending' THEN 1 ELSE 0 END) AS pending_orders,
SUM(CASE WHEN status = 'paid' THEN amount ELSE 0 END) AS paid_revenue
FROM orders;COUNT игнорирует NULL: сокращённый вариант с CASE
Поскольку COUNT игнорирует NULL, можно убрать ELSE: несовпадающие строки станут NULL и не будут подсчитаны. Это немного более короткий способ выполнить условный подсчёт.
SELECT
COUNT(CASE WHEN status = 'paid' THEN 1 END) AS paid_orders,
COUNT(CASE WHEN status = 'pending' THEN 1 END) AS pending_orders
FROM orders;CASE в ORDER BY для особой сортировки
Поместите CASE в ORDER BY, чтобы сортировать по заданному приоритету, а не в обычном алфавитном или числовом порядке — например, сначала срочные значения, затем обычные, а потом все остальные.
SELECT order_id, status
FROM orders
ORDER BY
CASE status
WHEN 'urgent' THEN 1
WHEN 'normal' THEN 2
ELSE 3
END,
order_id;Согласованность типов между ветвями
Все ветви CASE должны возвращать совместимый тип. Смешивание числа и строки может вызвать ошибку или принудительное приведение типа — выбирайте один тип результата и при необходимости явно приводите тип.
-- Keep branches the same type
SELECT CASE WHEN qty > 0 THEN CAST(qty AS VARCHAR)
ELSE 'none'
END AS qty_label
FROM inventory;CASE в WHERE для условной фильтрации
CASE в WHERE позволяет применять разную логику фильтрации в зависимости от флага — например, задавать разные пороги цены для разных регионов. Часто это понятнее, чем запутанная комбинация AND и OR.
SELECT order_id, amount, region
FROM orders
WHERE amount > CASE region
WHEN 'US' THEN 100
WHEN 'EU' THEN 90
ELSE 50
END;Быстрая проверка
Предскажите результат.
Итоги
Итак: CASE возвращает одно значение и работает в SELECT, WHERE, ORDER BY и агрегатных функциях. Поисковая форма обрабатывает диапазоны и NULL; срабатывает первое совпадение; при отсутствии совпадений возвращается NULL; типы ветвей должны быть совместимыми.
Часто задаваемые вопросы
Урок «Выражения CASE в SELECT» бесплатный?
Да — полный текст урока «Выражения CASE в SELECT» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс SQL Interview Prep, подпишись на CoddyKit PRO. Курс SQL Interview Prep содержит 4 уроков всего.
Чему я научусь в уроке «Выражения CASE в SELECT»?
Пишите встроенную условную логику и разбирайте поисковую и простую формы CASE. Ты практикуешь SQL Interview Prep с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать SQL Interview Prep?
Предыдущий опыт не требуется. SQL Interview Prep на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «Выражения CASE в SELECT»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке SQL Interview Prep?
Да. Каждый урок SQL Interview Prep включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Выбор столбцов и подводные камни псевдонимов
- Вычисляемые столбцы и приоритет выражений
- DISTINCT и GROUP BY для уникальности
- Выражения CASE в SELECT