0Pricing
Coding Interview Prep · Урок

Выражения CASE в SELECT

Пишите встроенную условную логику и разбирайте поисковую и простую формы CASE.

«Выражения CASE в SELECT» — бесплатный урок Coding Interview Prep на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Coding Interview Prep, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Coding 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) и разблокировать остальной курс Coding Interview Prep, подпишись на CoddyKit PRO. Курс Coding Interview Prep содержит 4 уроков всего.

Чему я научусь в уроке «Выражения CASE в SELECT»?

Пишите встроенную условную логику и разбирайте поисковую и простую формы CASE. Ты практикуешь Coding Interview Prep с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Coding Interview Prep?

Предыдущий опыт не требуется. Coding Interview Prep на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.

Сколько времени занимает урок «Выражения CASE в SELECT»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Coding Interview Prep?

Да. Каждый урок Coding Interview Prep включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Выбор столбцов и подводные камни псевдонимов
  2. Вычисляемые столбцы и приоритет выражений
  3. DISTINCT и GROUP BY для уникальности
  4. Выражения CASE в SELECT
← Назад к Coding Interview Prep