НейроАгент

SQL SELECT IF...THEN: Полное руководство

Узнайте, как реализовать логику IF...THEN в операторах SQL SELECT с помощью выражений CASE. Изучите специфичные для баз данных альтернативы, такие как MySQL IF() и SQL Server IIF(), с практическими примерами и рекомендациями.

Вопрос

Как выполнить оператор IF…THEN в SQL SELECT?

Например:

sql
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 — это универсальный способ реализации логики IF…THEN в SQL. Оно существует в двух основных формах:

Простое выражение CASE

sql
SELECT 
    CASE 
        WHEN Obsolete = 'N' OR InStock = 'Y' THEN 1 
        ELSE 0 
    END AS Saleable,
    * 
FROM Product

Поисковое выражение CASE

sql
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(), которая работает как тернарный оператор в вашем примере:

sql
SELECT IF(Obsolete = 'N' OR InStock = 'Y', 1, 0) AS Saleable, * FROM Product

MySQL также позволяет использовать COUNT с IF:

sql
SELECT COUNT(IF(status = 'shipped', 1, NULL)) AS shipped_orders FROM orders

SQL Server

SQL Server предоставляет IIF() для простых условий (доступно с SQL Server 2012):

sql
SELECT IIF(Obsolete = 'N' OR InStock = 'Y', 1, 0) AS Saleable, * FROM Product

Oracle

Oracle имеет DECODE() как устаревшую альтернативу CASE:

sql
SELECT DECODE(Obsolete, 'N', 1, DECODE(InStock, 'Y', 1, 0)) AS Saleable, * FROM Product

PostgreSQL

PostgreSQL поддерживает стандартный CASE плюс предложение FILTER для агрегатных функций:

sql
SELECT 
    COUNT(*) FILTER (WHERE status = 'shipped') AS shipped_orders 
FROM orders

Практические примеры и варианты использования

Категоризация данных

sql
SELECT 
    ID,
    CASE 
        WHEN Salary > 100000 THEN 'High'
        WHEN Salary BETWEEN 50000 AND 100000 THEN 'Medium'
        ELSE 'Low'
    END AS SalaryLevel
FROM Employees

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

sql
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

Сложная бизнес-логика

sql
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 для условного подсчета:

sql
-- Стандартный подход 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

sql
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

sql
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

sql
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

Лучшие практики

  1. Используйте стандартный CASE для максимальной переносимости - он работает во всех системах управления базами данных
  2. Упорядочивайте условия логически - SQL оценивает условия в порядке их следования, поэтому размещайте наиболее специфичные условия первыми
  3. Всегда включайте предложение ELSE - это предотвращает неожиданные результаты NULL
  4. Используйте подходящие типы данных - убедитесь, что выражения CASE возвращают согласованность типов данных
  5. Учитывайте производительность - сложные выражения CASE могут влиять на производительность запроса
  6. Используйте специфичные для СУБД функции при необходимости - для более простых условий IF() в MySQL или IIF() в SQL Server могут улучшить читаемость

Документация Oracle подчеркивает, что выражения CASE особенно полезны, потому что они позволяют реализовывать условную логику в SQL операторах без необходимости вызова хранимых процедур.


Источники

  1. SQL MAX + CASE WHEN Объяснено (2025 Руководство) - InterviewQuery
  2. Изучите Условные Выражения в BigQuery: Полное Руководство 2025 - Owox
  3. Условные Операторы Выбора - Документация Oracle
  4. SQL COUNT с CASE WHEN: Руководство по Условному Подсчету (2025) - InterviewQuery
  5. Синтаксис SQL - Википедия
  6. Выражения CASE - Документация Oracle
  7. Топ 100 Вопросов и Ответов для SQL Собеседования (2025) - GeeksforGeeks
  8. SQL Руководство, которого Инженерам Хотелось Бы Иметь - Medium

Заключение

  • Реализуйте логику IF…THEN в SQL SELECT операторах в основном с помощью выражения CASE, который универсально поддерживается во всех системах управления базами данных
  • MySQL предлагает прямую функцию IF() для более простой условной логики, в то время как SQL Server предоставляет IIF(), а Oracle имеет DECODE() в качестве альтернатив
  • Выражения CASE могут обрабатывать сложную бизнес-логику, категоризацию данных и условную агрегацию
  • Всегда включайте предложение ELSE, чтобы избежать неожиданных результатов NULL, и учитывайте производственные implications сложной условной логики
  • Выбирайте между стандартным CASE (для переносимости) и специфичными для СУБД функциями (для читаемости) на основе ваших конкретных требований и среды