Корректное использование CASE в SELECT запросе SQL

Пройдите тест, узнайте какой профессии подходите

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

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

Применение CASE позволяет внедрить условную логику в результаты SELECT:

SQL
Скопировать код
SELECT 
  column1, 
  CASE 
    WHEN условие THEN 'РезультатИстина' /* Это аналогично вашему утреннему кофе ☕ */
    ELSE 'РезультатЛожь' /* Ещё не совсем то, что вы ожидали 🎯 */
  END AS ПсевдонимПоля 
FROM 
  таблица;

условие проверяется для каждой строки. Если условие выполняется, то ПсевдонимПоля будет равен 'РезультатИстина'. В противном случае – 'РезультатЛожь'. Важно придерживаться правильного синтаксиса и структуры CASE. Уточняйте название таблицы перед CASE, если вы работаете с несколькими таблицами.

Кинга Идем в IT: пошаговый план для смены профессии

Практические примеры

Классификация данных с применением CASE

Категоризация данных упрощает их анализ, словно добавляя яркие цвета в монохромный набор цифр:

SQL
Скопировать код
SELECT
  ProductID,
  Price,
  CASE
    WHEN Price < 50 THEN 'Доступный' /* Выгодное предложение 🏷️ */
    WHEN Price BETWEEN 50 AND 150 THEN 'Средний' /* Популярный и предпочтительный вариант 🥛 */
    WHEN Price > 150 THEN 'Эксклюзивный' /* Синоним роскоши 🎩 */
    ELSE 'Непредсказуемый' /* Таинственная ценовая категория 🤷‍♂️ */
  END AS PriceCategory
FROM
  Products;

Пользовательская сортировка с использованием CASE в ORDER BY

Использование CASE в ORDER BY позволяет настроить порядок вывода записей в соответствии с определенными приоритетами:

SQL
Скопировать код
SELECT 
  EmployeeID, 
  Name, 
  Salary 
FROM 
  Employees
ORDER BY 
  CASE 
    WHEN Department = 'HR' THEN 1 /* HR-специалисты на первом месте 😁 */
    WHEN Department = 'IT' THEN 2 /* ИТ-специалисты следуют за ними 🐱‍💻 */
    ELSE 3
  END;

Таким образом создается впечатление, что специалисты по кадрам "главные", за ними идут IT-гуру, а все остальные сотрудники — в конце списка.

Обновление записей с использованием CASE

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

SQL
Скопировать код
UPDATE 
  Employees
SET 
  Role = CASE 
    WHEN PromotionDue THEN 'Старший ' + Role /* Повышение по службе 😎 */
    ELSE Role /* Без изменений… 🏊‍♂️ */
  END
WHERE 
  EmployeeID = @EmpID;

Изучаем применение CASE глубже

Сложная логика с помощью Searched CASE

Searched CASE позволяет проводить более сложные проверки, используя AND, OR и даже NOT:

SQL
Скопировать код
SELECT 
  ProductName, 
  Stock,
  CASE 
    WHEN Stock > 50 AND IsNew THEN 'Избыток и новинка' /* Всё идеально 😇 */
    WHEN Stock <= 50 OR IsDiscontinued THEN 'Спешите оформить заказ' /* Как цены на бензин… всегда колеблющиеся ⛽️ */
    ELSE 'В наличии' /* Доступно на складе ✌️ */
  END AS СтатусНаличия
FROM 
  Inventory;

Корректировка данных с помощью CASE и LIKE

Для создания динамических шаблонов сопоставления в запросах можно использовать сочетание CASE и LIKE. Это можно сравнить с гардеробом для разных ситуаций:

SQL
Скопировать код
SELECT 
  ProductName, 
  CASE 
    WHEN ProductName LIKE 'New%' THEN 'Новое' /* Новинка на полках 🚢 */
    WHEN ProductName LIKE 'Old%' THEN 'Классическое' /* Проверенное временем, как хорошее вино 🍷 */
    ELSE 'Стандартное' /* Просто товар ⚡ */
  END AS ТипТовара
FROM 
  ProductCatalog;

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

В этой секции CASE превращает запрос SELECT в отличного диспетчера, руководящего данными по различным маршрутам в зависимости от условий:

Markdown
Скопировать код
SELECT 
  Name,
  Age,
  CASE 
    WHEN Age < 20 THEN '👶 Молодой'
    WHEN Age BETWEEN 20 AND 29 THEN '👨‍💼 Возраст созревания'
    WHEN Age >= 30 THEN '🧔 Взрослый'
    ELSE '👽 Не определено'
  END as ВозрастнаяКатегория
FROM People;

Это можно сравнить с дорожным индикатором на перекрестке:

Markdown
Скопировать код
            👶 Молодой
              |
Созревающий --🚦-- Взрослый
              |
            👽 Не определено

На каждом шаге Age определeно перекрестком ВозрастнаяКатегория, которым управляет CASE.

Эффективные подходы и потенциальные проблемы

Ясность логики

В ходе составления CASE следует избегать неоднозначности и каждое условие формулировать ясно и четко:

SQL
Скопировать код
SELECT 
  StatusCode,
  CASE StatusCode
    WHEN 'A' THEN 'Одобрено' /* Всё идет по плану ✅ */
    WHEN 'R' THEN 'Отклонено' /* Тормозной сигнал 🛑 */
    WHEN 'P' THEN 'На рассмотрении' /* На стадии выполнения 🐌 */
    ELSE 'Статус не определён' /* Мистический статус 😸 */
  END AS СтатусОписание
FROM 
  ApplicationStatus;

CASE в GROUP BY и HAVING

CASE улучшает фильтрацию данных при агрегировании, используемую в GROUP BY и HAVING.

SQL
Скопировать код
SELECT 
  CASE 
    WHEN Age < 30 THEN 'До 30' /* Молодость только начинается 🕺 */
    ELSE '30 и старше' /* Этап зрелости 💃 */
  END AS ВозрастнаяГруппа,
  COUNT(*) AS Количество
FROM 
  Users
GROUP BY 
  ВозрастнаяГруппа
HAVING 
  COUNT(*) > 100; /* Фокус на численно крупных группах 🏆 */

Обработка NULL значений

При работе с CASE необходимо учитывать NULL. Функции COALESCE или ISNULL помогут предотвратить неожиданные проблемы:

SQL
Скопировать код
SELECT 
  CustomerID,
  CASE 
    WHEN COALESCE(Points, 0) > 1000 THEN 'VIP' /* Клиент высшего класса 👑 */
    ELSE 'Обычный' /* Стандартный покупатель 👀 */
  END AS СтатусКлиента
FROM 
  CustomerLoyalty;

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

  1. SQL CASE Expression — Знакомство с синтаксисом и примерами использования CASE.
  2. PostgreSQL: Documentation: 9.18 Conditional Expressions — Изучение условных выражений в PostgreSQL.
  3. The Many Uses of Coalesce in SQL Server — Погружение в применение функции COALESCE в комбинации с CASE.
  4. MySQL :: MySQL 8.0 Reference Manual :: 13.6.5.1 CASE StatementОфициальная документация MySQL по CASE.
  5. CASE Expressions — Подробное обсуждение семантики Oracle в отношении выражений CASE.