0Pricing
SQL Academy · Урок

Выражение CASE

Логика IF/THEN внутри запроса

«Выражение CASE» — бесплатный урок SQL Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения SQL Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс SQL Academy содержит 4 уроков всего.

Ветвление в SQL

Иногда нужно, чтобы запрос принял решение: если выполняется это, сделать то, иначе сделать что-то ещё. Для этого в SQL предусмотрено выражение CASE.

CASE позволяет возвращать разные значения в зависимости от условий прямо внутри SELECT. Представьте его как вариант цепочки if/else в SQL.

SELECT name,
       CASE WHEN price > 100 THEN 'expensive'
            ELSE 'affordable'
       END AS price_band
FROM products;

Структура CASE

Выражение CASE состоит из нескольких частей:

  • WHEN condition THEN value — одна или несколько ветвей
  • ELSE value — необязательное резервное значение
  • END — завершает выражение (обязательно!)

SQL проверяет ветви WHEN сверху вниз и возвращает значение первой ветви, для которой условие истинно.

CASE WHEN condition1 THEN result1
     WHEN condition2 THEN result2
     ELSE default_result
END

CASE возвращает значение

Главная идея: выражение CASE вычисляется в одно значение для каждой строки. Поскольку оно создаёт значение, его можно использовать везде, где допускается значение: в списке SELECT, в WHERE, в ORDER BY и даже внутри функций.

Здесь каждой строке заказа присваивается простой статус.

SELECT order_id,
       CASE WHEN shipped_at IS NOT NULL THEN 'shipped'
            WHEN paid_at IS NOT NULL THEN 'paid'
            ELSE 'pending'
       END AS status
FROM orders;

Побеждает первое совпадение

Порядок имеет значение. SQL последовательно проверяет каждый WHEN и останавливается на первом истинном условии. Последующие ветви игнорируются, даже если они тоже подходят.

В приведённом ниже примере заказ на сумму больше 1000 — «большой», а не «средний», потому что побеждает первая подходящая ветвь.

SELECT order_id, total,
       CASE WHEN total >= 1000 THEN 'large'
            WHEN total >= 100  THEN 'medium'
            ELSE 'small'
       END AS size_band
FROM orders;

Ветка ELSE

Ветка ELSE обрабатывает все остальные случаи. Если ни одно условие WHEN не истинно, CASE возвращает значение ELSE.

Если опустить ELSE и ни одна ветвь не подойдёт, CASE вернёт NULL. Это частая причина неожиданных значений NULL, поэтому добавляйте явный ELSE, когда нужен определённый результат.

SELECT name,
       CASE WHEN stock = 0 THEN 'out of stock' END AS note
FROM products;
-- rows with stock > 0 get NULL in note (no ELSE)

Условия могут быть любыми

Условие WHEN — это обычное логическое выражение, такое же, как в предложении WHERE. Можно использовать сравнения, AND, OR, BETWEEN, IN, LIKE и другие конструкции.

SELECT email,
       CASE WHEN country IN ('US','CA') AND age >= 18 THEN 'eligible'
            WHEN email LIKE '%@test.com'             THEN 'test account'
            ELSE 'review'
       END AS segment
FROM users;

Типы результатов должны быть совместимыми

Каждая ветвь CASE должна возвращать значения совместимого типа, поскольку у столбца может быть только один тип. Смешивание текста и чисел вызовет ошибку или приведёт к неожиданному преобразованию типов.

Если в одной ветви нужны числа, а в другой — текст, выполните явное приведение, чтобы типы совпадали.

SELECT product_id,
       CASE WHEN on_sale THEN price * 0.9
            ELSE price
       END AS effective_price   -- all branches numeric: good
FROM products;

Использование CASE в WHERE

Поскольку CASE возвращает значение, результат можно сравнивать внутри предложения WHERE. Это удобно для правил динамической фильтрации.

Однако часто обычная логика с логическими операторами в WHERE понятнее — используйте CASE в WHERE только тогда, когда ветвление действительно упрощает условие.

SELECT *
FROM orders
WHERE CASE WHEN priority = 'high' THEN total > 0
           ELSE total > 500
      END;

Вложенные CASE

Можно поместить CASE в другую ветвь CASE, чтобы выразить многоуровневую логику. Это работает, но глубоко вложенные выражения становится трудно читать.

Старайтесь не делать вложенность глубокой; если она разрастается, обычно понятнее использовать отдельный столбец или справочную таблицу.

SELECT order_id,
       CASE WHEN region = 'EU' THEN
              CASE WHEN total > 100 THEN 'EU big'
                   ELSE 'EU small' END
            ELSE 'other'
       END AS bucket
FROM orders;

CASE с агрегатными функциями

Мощный приём — поместить CASE внутрь такой агрегатной функции, как SUM или COUNT. Так можно условно подсчитывать или суммировать строки за один проход — иногда это называют условной агрегацией или сводным представлением.

SELECT
  COUNT(*) AS total_orders,
  SUM(CASE WHEN status = 'shipped' THEN 1 ELSE 0 END) AS shipped,
  SUM(CASE WHEN status = 'pending' THEN 1 ELSE 0 END) AS pending
FROM orders;

Намеренный возврат NULL

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

Здесь только крупные заказы сохраняют свою сумму; для остальных получается NULL, поэтому AVG пропустит их.

SELECT order_id,
       CASE WHEN total >= 1000 THEN total
            ELSE NULL
       END AS large_order_total
FROM orders;

Быстрая проверка

Рассмотрите это выражение для строки, где total = 1500:

CASE WHEN total >= 100 THEN 'medium' WHEN total >= 1000 THEN 'large' ELSE 'small' END

Какое значение оно возвращает?

Повторение: выражение CASE

Вы изучили основы условной логики в SQL:

  • CASE WHEN ... THEN ... ELSE ... END возвращает одно значение для каждой строки
  • Ветви проверяются сверху вниз; первое совпадение имеет приоритет
  • Если опустить ELSE, при отсутствии совпадений возвращается NULL
  • Все ветви должны возвращать совместимые типы
  • CASE работает в SELECT, WHERE и внутри агрегатных функций

Далее мы сравним две синтаксические формы CASE.

SELECT name,
       CASE WHEN price > 100 THEN 'expensive'
            WHEN price > 20  THEN 'mid'
            ELSE 'cheap'
       END AS tier
FROM products;

Часто задаваемые вопросы

Урок «Выражение CASE» бесплатный?

Да — полный текст урока «Выражение CASE» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс SQL Academy, подпишись на CoddyKit PRO. Курс SQL Academy содержит 4 уроков всего.

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

Логика IF/THEN внутри запроса Ты практикуешь SQL Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать SQL Academy?

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

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

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

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

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

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

  1. Выражение CASE
  2. Поисковый и простой CASE
  3. Группировка и маркировка данных
  4. CASE в ORDER BY и агрегатах
← Назад к SQL Academy