0Pricing
SQL Academy · Урок

Поисковый и простой 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 — локальная установка не требуется.

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

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