Корректное использование CASE в SELECT запросе SQL
Быстрый ответ
Применение CASE
позволяет внедрить условную логику в результаты SELECT
:
SELECT
column1,
CASE
WHEN условие THEN 'РезультатИстина' /* Это аналогично вашему утреннему кофе ☕ */
ELSE 'РезультатЛожь' /* Ещё не совсем то, что вы ожидали 🎯 */
END AS ПсевдонимПоля
FROM
таблица;
условие
проверяется для каждой строки. Если условие выполняется, то ПсевдонимПоля
будет равен 'РезультатИстина'
. В противном случае – 'РезультатЛожь'
. Важно придерживаться правильного синтаксиса и структуры CASE
. Уточняйте название таблицы перед CASE
, если вы работаете с несколькими таблицами.
Практические примеры
Классификация данных с применением CASE
Категоризация данных упрощает их анализ, словно добавляя яркие цвета в монохромный набор цифр:
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
позволяет настроить порядок вывода записей в соответствии с определенными приоритетами:
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
в условиях переменчивой ситуации:
UPDATE
Employees
SET
Role = CASE
WHEN PromotionDue THEN 'Старший ' + Role /* Повышение по службе 😎 */
ELSE Role /* Без изменений… 🏊♂️ */
END
WHERE
EmployeeID = @EmpID;
Изучаем применение CASE глубже
Сложная логика с помощью Searched CASE
Searched CASE позволяет проводить более сложные проверки, используя AND
, OR
и даже NOT
:
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
. Это можно сравнить с гардеробом для разных ситуаций:
SELECT
ProductName,
CASE
WHEN ProductName LIKE 'New%' THEN 'Новое' /* Новинка на полках 🚢 */
WHEN ProductName LIKE 'Old%' THEN 'Классическое' /* Проверенное временем, как хорошее вино 🍷 */
ELSE 'Стандартное' /* Просто товар ⚡ */
END AS ТипТовара
FROM
ProductCatalog;
Визуализация
В этой секции CASE
превращает запрос SELECT в отличного диспетчера, руководящего данными по различным маршрутам в зависимости от условий:
SELECT
Name,
Age,
CASE
WHEN Age < 20 THEN '👶 Молодой'
WHEN Age BETWEEN 20 AND 29 THEN '👨💼 Возраст созревания'
WHEN Age >= 30 THEN '🧔 Взрослый'
ELSE '👽 Не определено'
END as ВозрастнаяКатегория
FROM People;
Это можно сравнить с дорожным индикатором на перекрестке:
👶 Молодой
|
Созревающий --🚦-- Взрослый
|
👽 Не определено
На каждом шаге Age
определeно перекрестком ВозрастнаяКатегория
, которым управляет CASE
.
Эффективные подходы и потенциальные проблемы
Ясность логики
В ходе составления CASE
следует избегать неоднозначности и каждое условие формулировать ясно и четко:
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
.
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
помогут предотвратить неожиданные проблемы:
SELECT
CustomerID,
CASE
WHEN COALESCE(Points, 0) > 1000 THEN 'VIP' /* Клиент высшего класса 👑 */
ELSE 'Обычный' /* Стандартный покупатель 👀 */
END AS СтатусКлиента
FROM
CustomerLoyalty;
Полезные материалы
- SQL CASE Expression — Знакомство с синтаксисом и примерами использования CASE.
- PostgreSQL: Documentation: 9.18 Conditional Expressions — Изучение условных выражений в PostgreSQL.
- The Many Uses of Coalesce in SQL Server — Погружение в применение функции COALESCE в комбинации с CASE.
- MySQL :: MySQL 8.0 Reference Manual :: 13.6.5.1 CASE Statement — Официальная документация MySQL по CASE.
- CASE Expressions — Подробное обсуждение семантики Oracle в отношении выражений CASE.