Правильный синтаксис и применение SQL Case: примеры и советы

Пройдите тест, узнайте какой профессии подходите и получите бесплатную карьерную консультацию
В конце подарим скидку до 55% на обучение
Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Выражение CASE в SQL служит для реализации условной логики в запросах, что аналогично конструкции IF-ELSE в программировании. Применение выражения выглядит следующим образом:

SQL
Скопировать код
SELECT 
    CASE WHEN условие THEN результат 
    ELSE значение_по_умолчанию END 
FROM таблица;

Например, для категоризации возраста, запрос будет выглядеть так:

SQL
Скопировать код
SELECT 
    CASE 
        WHEN возраст < 18 THEN 'Несовершеннолетний'
        WHEN возраст >= 18 THEN 'Взрослый'
    END AS ГруппаВозраста
FROM люди;

Данный запрос определяет каждый возраст как 'Несовершеннолетний' или 'Взрослый' и выводит результат в столбец ГруппаВозраста.

Основы CASE

Простой и поисковый: два типа CASE

В SQL существует два варианта выражений CASE — это простой CASE и поисковый CASE. Выбор между ними зависит от поставленной задачи:

  1. Простой CASE сравнивает единое выражение с несколькими конкретными значениями. Пример использования:
SQL
Скопировать код
SELECT 
    CASE цвет 
        WHEN 'красный' THEN 'стоп'   
        WHEN 'желтый' THEN 'внимание' 
        WHEN 'зеленый' THEN 'иди'
        ELSE 'неизвестно' 
    END AS светофор
FROM сигналы;
  1. Поисковый CASE применяется для проверки последовательности логических условий, например, при учете успеваемости студентов:
SQL
Скопировать код
SELECT 
    CASE 
        WHEN оценка >= 90 THEN 'Отлично'
        WHEN оценка >= 80 THEN 'Хорошо'
        WHEN оценка >= 70 THEN 'Средне'
        ELSE 'Требуется улучшение'
    END AS классификация
FROM результаты_экзаменов;

Обход проблемы NULL в ELSE

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

SQL
Скопировать код
CASE 
    WHEN условие THEN результат 
    ELSE 'Значение по умолчанию'
END

Также можно использовать функцию COALESCE для замены NULL на значение по умолчанию:

SQL
Скопировать код
COALESCE(
    (CASE 
        WHEN условие THEN результат 
    END), 
    'Значение по умолчанию'
)

Практические советы при работе с CASE

  • Порядок: Располагайте условия таким образом, чтобы самые вероятные варианты проверялись в первую очередь.
  • Простота: Чем более простые условия, тем выше читаемость кода и удобнее его поддержка.
  • Полное покрытие: Убедитесь, что ваша логика охватывает все возможные случаи.

CASE: Продвинутое использование

Условная агрегация в отчетах

Особо интересное применение выражение CASE находит при условной агрегации:

SQL
Скопировать код
SELECT 
    SUM(CASE WHEN пол = 'Женский' THEN сумма ELSE 0 END) AS ОбщаяСуммаЖенскихПродаж,
    SUM(CASE WHEN пол = 'Мужской' THEN сумма ELSE 0 END) AS ОбщаяСуммаМужскихПродаж
FROM продажи;

Вложенные CASE

Для сложных логических конструкций возможно применение вложенных выражений CASE:

SQL
Скопировать код
SELECT 
    CASE 
        WHEN внешнее_условие THEN 
            (CASE
                WHEN внутреннее_условие THEN 'Результат А'
                ELSE 'Результат В'
            END)
        ELSE 'Результат С'
    END AS вложенный_результат
FROM данные;

CASE в операциях JOIN

Выражение CASE может быть использовано в условиях JOIN для создания динамических условий соединения таблиц:

SQL
Скопировать код
SELECT *
FROM таблица1 
JOIN таблица2 ON 
    CASE 
        WHEN таблица1.столбец = 'условие' THEN таблица1.id = таблица2.соответствующий_id
        ELSE таблица1.id = таблица2.стандартный_id
    END

Визуализация

Изобразить выражение CASE можно как перекресток с разными маршрутами:

                🚦 CASE WHEN условие1 THEN результат1 🚦
                    /
SQL-поток       ---> X  WHEN условие2 THEN результат2  ---> Путь результата
                    \
                🚦 ELSE результат_по_умолчанию 🚦
  • Каждый светофор — это WHEN.
  • THEN задаёт направление движения.
  • ELSE — это альтернативный маршрут в случае, если условия не выполнились.

Таким образом, SQL-запрос умеет определить, что делать в зависимости от условий.

Полезные материалы

  1. CASE (Transact-SQL) – SQL Server | Microsoft Learn — официальная документация Microsoft по использованию CASE.
  2. SQL выражение CASE – W3Schools — обучающее пособие по SQL выражению CASE от W3 Schools.
  3. SQL CASE | Продвинутый SQL – Mode — инструкция по использованию CASE в SQL-запросах с примерами на практике.
  4. Выражения CASE – Официальная документация Oracle — подробное описание синтаксиса и использования CASE.
  5. PostgreSQL: Документация: 16: 9.18. Условные Выражения — официальная документация PostgreSQL о CASE и других условных выражениях.