Поисковый и простой CASE
Два способа написать CASE
«Поисковый и простой CASE» — бесплатный урок SQL Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения SQL Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс SQL Academy содержит 4 уроков всего.
Два способа записать CASE
В SQL есть два варианта выражения CASE: простой CASE и поисковый CASE. Оба возвращают значение на основе условий, но отличаются способом записи этих условий.
К концу урока вы будете знать, когда использовать каждую форму и как избегать распространённых ошибок при их смешивании.
Простой CASE — идея
Простой CASE сравнивает одно выражение со списком значений. Представьте его как таблицу соответствий: слева выбирается один столбец или значение, а затем в каждой ветви WHEN указывается, чему равно это значение.
Синтаксис: CASE expression WHEN value1 THEN result1 WHEN value2 THEN result2 ELSE default END
SELECT
product_name,
category_id,
CASE category_id
WHEN 1 THEN 'Electronics'
WHEN 2 THEN 'Clothing'
WHEN 3 THEN 'Books'
ELSE 'Other'
END AS category_name
FROM products;Простой CASE на практике
Здесь выражение CASE находится сразу после ключевого слова, а столбец status сравнивается с каждым значением WHEN на равенство. Обратите внимание, что в ветвях WHEN не нужно писать status = — сравнение подразумевается.
SELECT
order_id,
status,
CASE status
WHEN 'pending' THEN 'Awaiting payment'
WHEN 'paid' THEN 'Payment received'
WHEN 'shipped' THEN 'On its way'
WHEN 'delivered' THEN 'Completed'
ELSE 'Unknown status'
END AS status_label
FROM orders;Поисковый CASE — идея
В поисковом CASE сразу после ключевого слова CASE нет выражения. Вместо этого каждая ветвь WHEN содержит полное логическое условие. Это делает форму гораздо гибче: в каждой ветви WHEN можно использовать разные столбцы, проверять диапазоны или вызывать функции.
Синтаксис: CASE WHEN condition1 THEN result1 WHEN condition2 THEN result2 ELSE default END
SELECT
employee_name,
salary,
CASE
WHEN salary < 30000 THEN 'Entry Level'
WHEN salary < 60000 THEN 'Mid Level'
WHEN salary < 100000 THEN 'Senior'
ELSE 'Executive'
END AS salary_band
FROM employees;Поисковый CASE на практике
Поскольку каждое WHEN принимает любое логическое выражение, в одной ветви можно объединять несколько столбцов. База данных оценивает условия WHEN сверху вниз и возвращает результат первой ветви, для которой значение равно TRUE.
SELECT
product_name,
stock,
price,
CASE
WHEN stock = 0 THEN 'Out of stock'
WHEN stock < 10 AND price > 100 THEN 'Low stock — premium item'
WHEN stock < 10 THEN 'Low stock'
ELSE 'In stock'
END AS availability
FROM products;Ключевое структурное различие
В таблице ниже показано основное различие:
Простой CASE — одно выражение после CASE, каждая ветвь WHEN проверяет равенство с этим выражением.
Поисковый CASE — после CASE нет выражения, каждое WHEN является самостоятельным логическим условием.
Поскольку простой CASE выполняет только проверки на равенство, он не умеет обрабатывать диапазоны, NULL или условия с несколькими столбцами. Для всего, что выходит за рамки прямого сопоставления значений, используйте поисковый CASE.
-- Simple CASE: equality only
SELECT CASE day_number
WHEN 1 THEN 'Monday'
WHEN 2 THEN 'Tuesday'
ELSE 'Other'
END AS day_name
FROM schedule;
-- Searched CASE: any condition
SELECT CASE
WHEN day_number BETWEEN 1 AND 5 THEN 'Weekday'
WHEN day_number IN (6, 7) THEN 'Weekend'
END AS day_type
FROM schedule;Обработка NULL — почему поисковый CASE лучше
Простой CASE использует внутри себя =, а выражение NULL = NULL в SQL никогда не равно TRUE. Поэтому простой CASE не может сопоставить столбец со значением NULL. В поисковом CASE можно написать WHEN column IS NULL THEN ..., и это будет работать правильно.
-- Simple CASE: NULL branch never matches
SELECT CASE manager_id
WHEN NULL THEN 'No manager' -- this will NEVER fire
ELSE 'Has manager'
END
FROM employees;
-- Searched CASE: correct NULL check
SELECT CASE
WHEN manager_id IS NULL THEN 'No manager'
ELSE 'Has manager'
END AS manager_status
FROM employees;Использование столбцов в поисковом CASE
Важное преимущество поискового CASE состоит в том, что каждая ветвь WHEN может обращаться к совершенно разным столбцам или вызывать функции. Это позволяет задавать сложные бизнес-правила, с которыми простой CASE вообще не справится.
SELECT
customer_name,
total_orders,
total_spent,
CASE
WHEN total_spent > 10000 AND total_orders > 20 THEN 'VIP'
WHEN total_spent > 5000 THEN 'Gold'
WHEN total_orders > 10 THEN 'Silver'
ELSE 'Standard'
END AS tier
FROM customers;Использование CASE в ORDER BY
Обе формы CASE можно использовать внутри ORDER BY, чтобы создать собственный порядок сортировки, которого нет в исходных данных. Здесь простой CASE сопоставляет названия приоритетов с числами, поэтому строки сортируются в порядке важности для бизнеса, а не по алфавиту.
SELECT ticket_id, subject, priority
FROM support_tickets
ORDER BY
CASE priority
WHEN 'critical' THEN 1
WHEN 'high' THEN 2
WHEN 'medium' THEN 3
WHEN 'low' THEN 4
ELSE 5
END ASC;CASE внутри агрегатных функций
Обёртывание поискового CASE в SUM или COUNT — классический способ выполнить условную агрегацию, иногда называемый сводной таблицей. Это позволяет получить итоги по нескольким категориям за один просмотр данных вместо выполнения нескольких запросов.
SELECT
department,
COUNT(*) AS total_employees,
SUM(CASE WHEN gender = 'F' THEN 1 ELSE 0 END) AS female_count,
SUM(CASE WHEN gender = 'M' THEN 1 ELSE 0 END) AS male_count,
SUM(CASE WHEN salary > 70000 THEN salary ELSE 0 END) AS high_earner_payroll
FROM employees
GROUP BY department;Выбор подходящей формы
Практическое правило:
Используйте простой CASE, когда сопоставляете один столбец с фиксированным набором известных значений: такая запись короче и проще для чтения.
Используйте поисковый CASE во всех остальных случаях: для диапазонов, проверок NULL, логики с несколькими столбцами или вызовов функций внутри условий.
Если сомневаетесь, поисковый CASE всегда подойдёт. Любой простой CASE можно переписать как поисковый CASE, но обратное невозможно.
-- These two queries return identical results
-- Simple CASE (concise for equality)
SELECT CASE region_code
WHEN 'US' THEN 'United States'
WHEN 'UK' THEN 'United Kingdom'
ELSE 'International'
END AS region_name
FROM sales;
-- Equivalent Searched CASE
SELECT CASE
WHEN region_code = 'US' THEN 'United States'
WHEN region_code = 'UK' THEN 'United Kingdom'
ELSE 'International'
END AS region_name
FROM sales;Быстрая проверка
Проверьте, насколько хорошо вы понимаете различия между простым и поисковым CASE.
Итоги урока
Вот что вы изучили на этом уроке:
Простой CASE — после CASE указывается одно выражение; каждый WHEN проверяет, равно ли это выражение определённому значению. Лучше всего подходит для сопоставления одного столбца с фиксированным списком меток.
Поисковый CASE — после CASE нет выражения; каждый WHEN содержит полное логическое условие. Поддерживает диапазоны, проверки NULL, логику с несколькими столбцами и вызовы функций.
Обе формы проверяют ветви сверху вниз и возвращают результат первой ветви со значением TRUE. Если ни одна ветвь не совпала и ELSE отсутствует, результатом будет NULL. Для максимальной гибкости всегда безопаснее выбрать поисковый CASE: он умеет всё то же, что и простой CASE, и даже больше.
Часто задаваемые вопросы
Урок «Поисковый и простой CASE» бесплатный?
Да — полный текст урока «Поисковый и простой CASE» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс SQL Academy, подпишись на CoddyKit PRO. Курс SQL Academy содержит 4 уроков всего.
Чему я научусь в уроке «Поисковый и простой CASE»?
Два способа написать CASE Ты практикуешь SQL Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать SQL Academy?
Предыдущий опыт не требуется. SQL Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Поисковый и простой CASE»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке SQL Academy?
Да. Каждый урок SQL Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Выражение CASE
- Поисковый и простой CASE
- Группировка и маркировка данных
- CASE в ORDER BY и агрегатах