Выражение 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
ENDCASE возвращает значение
Главная идея: выражение 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 — локальная установка не требуется.