Как выполнить оператор IF…THEN в SQL SELECT?
Например:
SELECT IF(Obsolete = 'N' OR InStock = 'Y' ? 1 : 0) AS Saleable, * FROM Product
Реализация логики IF…THEN в SQL SELECT операторах
Вы можете реализовать логику IF…THEN в SQL SELECT операторах с помощью выражения CASE, который является стандартным подходом во всех системах управления базами данных. Хотя некоторые СУБД предлагают специфические функции, такие как IF() в MySQL или IIF() в SQL Server, выражение CASE обеспечивает наиболее портативное и гибкое решение для условной логики в запросах.
Содержание
- Стандартный синтаксис CASE WHEN
- Альтернативы, специфичные для СУБД
- Практические примеры и варианты использования
- Расширенная условная логика
- Лучшие практики
Стандартный синтаксис CASE WHEN
Выражение CASE — это универсальный способ реализации логики IF…THEN в SQL. Оно существует в двух основных формах:
Простое выражение CASE
SELECT
CASE
WHEN Obsolete = 'N' OR InStock = 'Y' THEN 1
ELSE 0
END AS Saleable,
*
FROM Product
Поисковое выражение CASE
SELECT
CASE
WHEN condition1 THEN result1
WHEN condition2 THEN result2
...
ELSE default_result
END AS alias_name
FROM table_name
Как указано в стандарте SQL, SQL проверяет условия WHEN в том порядке, в котором они появляются, и если ни одно условие не выполнено, по умолчанию возвращает NULL, если не указано предложение ELSE.
Альтернативы, специфичные для СУБД
MySQL
MySQL поддерживает прямую функцию IF(), которая работает как тернарный оператор в вашем примере:
SELECT IF(Obsolete = 'N' OR InStock = 'Y', 1, 0) AS Saleable, * FROM Product
MySQL также позволяет использовать COUNT с IF:
SELECT COUNT(IF(status = 'shipped', 1, NULL)) AS shipped_orders FROM orders
SQL Server
SQL Server предоставляет IIF() для простых условий (доступно с SQL Server 2012):
SELECT IIF(Obsolete = 'N' OR InStock = 'Y', 1, 0) AS Saleable, * FROM Product
Oracle
Oracle имеет DECODE() как устаревшую альтернативу CASE:
SELECT DECODE(Obsolete, 'N', 1, DECODE(InStock, 'Y', 1, 0)) AS Saleable, * FROM Product
PostgreSQL
PostgreSQL поддерживает стандартный CASE плюс предложение FILTER для агрегатных функций:
SELECT
COUNT(*) FILTER (WHERE status = 'shipped') AS shipped_orders
FROM orders
Практические примеры и варианты использования
Категоризация данных
SELECT
ID,
CASE
WHEN Salary > 100000 THEN 'High'
WHEN Salary BETWEEN 50000 AND 100000 THEN 'Medium'
ELSE 'Low'
END AS SalaryLevel
FROM Employees
Условная агрегация
SELECT
department,
SUM(CASE WHEN performance = 'High' THEN salary ELSE 0 END) AS high_performer_salaries,
COUNT(CASE WHEN performance = 'High' THEN 1 END) AS high_performer_count
FROM employees
GROUP BY department
Сложная бизнес-логика
SELECT
name,
salary,
CASE
WHEN department = 'Sales' AND salary > 80000 THEN 'High Performer'
WHEN department = 'Sales' OR salary > 100000 THEN 'Target for Bonus'
WHEN NOT (department IN ('HR', 'Legal')) THEN 'Eligible for Stock'
ELSE 'Standard'
END AS employee_category
FROM employees
Условный подсчет
Как объясняется на InterviewQuery, вы можете использовать CASE WITH для условного подсчета:
-- Стандартный подход CASE WHEN (портабельный)
SELECT COUNT(CASE WHEN status = 'shipped' THEN 1 END) AS shipped_orders FROM orders;
-- Специфичный для PostgreSQL подход с FILTER
SELECT COUNT(*) FILTER (WHERE status = 'shipped') AS shipped_orders FROM orders;
Расширенная условная логика
Вложенные выражения CASE
SELECT
CASE
WHEN status = 'shipped' THEN
CASE WHEN shipping_method = 'express' THEN 'Express Shipped'
ELSE 'Standard Shipped'
END
WHEN status = 'pending' THEN 'Pending'
ELSE 'Unknown'
END AS delivery_status
FROM orders
Множественные условия с AND/OR
SELECT
CASE
WHEN (department = 'Sales' AND sales > 100000) OR
(department = 'Marketing' AND campaigns > 50) THEN 'Top Performer'
WHEN department IN ('HR', 'Legal') THEN 'Support'
ELSE 'Regular'
END AS performance_category
FROM employees
Обработка NULL
SELECT
CASE
WHEN value IS NULL THEN 'No Value'
WHEN value > 0 THEN 'Positive'
WHEN value < 0 THEN 'Negative'
ELSE 'Zero'
END AS value_category
FROM numbers
Лучшие практики
- Используйте стандартный CASE для максимальной переносимости - он работает во всех системах управления базами данных
- Упорядочивайте условия логически - SQL оценивает условия в порядке их следования, поэтому размещайте наиболее специфичные условия первыми
- Всегда включайте предложение ELSE - это предотвращает неожиданные результаты NULL
- Используйте подходящие типы данных - убедитесь, что выражения CASE возвращают согласованность типов данных
- Учитывайте производительность - сложные выражения CASE могут влиять на производительность запроса
- Используйте специфичные для СУБД функции при необходимости - для более простых условий IF() в MySQL или IIF() в SQL Server могут улучшить читаемость
Документация Oracle подчеркивает, что выражения CASE особенно полезны, потому что они позволяют реализовывать условную логику в SQL операторах без необходимости вызова хранимых процедур.
Источники
- SQL MAX + CASE WHEN Объяснено (2025 Руководство) - InterviewQuery
- Изучите Условные Выражения в BigQuery: Полное Руководство 2025 - Owox
- Условные Операторы Выбора - Документация Oracle
- SQL COUNT с CASE WHEN: Руководство по Условному Подсчету (2025) - InterviewQuery
- Синтаксис SQL - Википедия
- Выражения CASE - Документация Oracle
- Топ 100 Вопросов и Ответов для SQL Собеседования (2025) - GeeksforGeeks
- SQL Руководство, которого Инженерам Хотелось Бы Иметь - Medium
Заключение
- Реализуйте логику IF…THEN в SQL SELECT операторах в основном с помощью выражения CASE, который универсально поддерживается во всех системах управления базами данных
- MySQL предлагает прямую функцию IF() для более простой условной логики, в то время как SQL Server предоставляет IIF(), а Oracle имеет DECODE() в качестве альтернатив
- Выражения CASE могут обрабатывать сложную бизнес-логику, категоризацию данных и условную агрегацию
- Всегда включайте предложение ELSE, чтобы избежать неожиданных результатов NULL, и учитывайте производственные implications сложной условной логики
- Выбирайте между стандартным CASE (для переносимости) и специфичными для СУБД функциями (для читаемости) на основе ваших конкретных требований и среды