SQL Server ДЕЛО

В этом руководстве вы узнаете, как использовать выражение SQL Server CASE для добавления логики if-else в SQL-запросы.

Выражение CASE SQL Server оценивает список условий и возвращает один из нескольких указанных результатов. Выражение CASE имеет два формата: простое выражение CASE и искомое выражение CASE. Оба формата выражения CASE поддерживают необязательный оператор ELSE.

Поскольку CASE является выражением, его можно использовать в любом предложении, которое принимает выражение, например SELECT, WHERE, GROUP BY и HAVING.

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

Ниже показан синтаксис простого выражения CASE:

CASE input   
    WHEN e1 THEN r1
    WHEN e2 THEN r2
    ...
    WHEN en THEN rn
    [ ELSE re ]   
END  

Простое выражение CASE сравнивает входное выражение(input) с выражением(ei) в каждом предложении WHEN на предмет равенства. Если входное выражение равно выражению(ei) в предложении WHEN, возвращается результат(ri) в соответствующем предложении THEN.

Если входное выражение не равно ни одному выражению и доступно предложение ELSE, выражение CASE вернет результат в предложении ELSE(re).

Если предложение ELSE пропущено и входное выражение не равно ни одному выражению в предложении WHEN, выражение CASE вернет NULL.

A) Использование простого выражения CASE в примере предложения SELECT

См. следующую таблицу sales.orders из примера базы данных :

В этом примере функция COUNT() используется с предложением GROUP BY для возврата количества заказов для каждого статуса заказа:

SELECT    
    order_status, 
    COUNT(order_id) order_count
FROM    
    sales.orders
WHERE 
    YEAR(order_date) = 2018
GROUP BY 
    order_status;

Вот что получилось:

Выражение SQL Server CASE — упорядочить количество по статусу

Значения в столбце order_status являются числами, что не имеет смысла в данном случае. Чтобы сделать вывод более понятным, можно использовать простое выражение CASE, как показано в следующем запросе:

SELECT    
    CASE order_status
        WHEN 1 THEN 'Pending'
        WHEN 2 THEN 'Processing'
        WHEN 3 THEN 'Rejected'
        WHEN 4 THEN 'Completed'
    END AS order_status, 
    COUNT(order_id) order_count
FROM    
    sales.orders
WHERE 
    YEAR(order_date) = 2018
GROUP BY 
    order_status;

На следующем рисунке показан результат:

Выражение CASE SQL Server — использование простого CASE в предложении SELECT

B) Пример использования простого выражения CASE в агрегатной функции

См. следующий запрос:

SELECT    
    SUM(CASE
            WHEN order_status = 1
            THEN 1
            ELSE 0
        END) AS 'Pending', 
    SUM(CASE
            WHEN order_status = 2
            THEN 1
            ELSE 0
        END) AS 'Processing', 
    SUM(CASE
            WHEN order_status = 3
            THEN 1
            ELSE 0
        END) AS 'Rejected', 
    SUM(CASE
            WHEN order_status = 4
            THEN 1
            ELSE 0
        END) AS 'Completed', 
    COUNT(*) AS Total
FROM    
    sales.orders
WHERE 
    YEAR(order_date) = 2018;

Вот что получилось:

Пример выражения CASE SQL Server в агрегатных функциях

В этом примере:

  • Во-первых, условие в пункте WHERE включает заказ на продажу в 2018 году.
  • Во-вторых, выражение CASE возвращает либо 1, либо 0 в зависимости от статуса заказа.
  • В-третьих, функция SUM() суммирует количество заказов для каждого статуса заказа.
  • В-четвертых, функция COUNT() возвращает общее количество заказов.

SQL Server выполнил поиск выражения CASE

Ниже показан синтаксис искомого выражения CASE:

CASE  
    WHEN e1 THEN r1
    WHEN e2 THEN r2
    ...
    WHEN en THEN rn
    [ ELSE re ]   
END 

В этом синтаксисе:

  • e1, e2, …ei, …en — булевы выражения.
  • r1, r2, …ri,… или rn — один из возможных результатов.

Искомое выражение CASE оценивает логическое выражение в каждом предложении WHEN в указанном порядке и возвращает результат(ri), если логическое выражение(ei) имеет значение TRUE.

Если ни одно логическое выражение не имеет значения TRUE, искомое выражение CASE возвращает результат(re) в предложении ELSE или NULL, если предложение ELSE не указано.

A) Использование искомого выражения CASE в предложении SELECT

См. следующие sales.orders и sales.order_items из примера базы данных :

Образцы таблиц

Следующий оператор использует искомое выражение CASE для классификации заказов на продажу по стоимости заказа:

SELECT    
    o.order_id, 
    SUM(quantity * list_price) order_value,
    CASE
        WHEN SUM(quantity * list_price)  500 AND 
            SUM(quantity * list_price)  1000 AND 
            SUM(quantity * list_price)  5000 AND 
            SUM(quantity * list_price)  10000 
            THEN 'Very High'
    END order_priority
FROM    
    sales.orders o
INNER JOIN sales.order_items i ON i.order_id = o.order_id
WHERE 
    YEAR(order_date) = 2018
GROUP BY 
    o.order_id;

На следующем рисунке показан частичный вывод:

Выражение CASE SQL Server — пример поиска выражения CASE

В этом руководстве вы узнаете, как использовать выражение CASE SQL Server для добавления логики if-else в SQL-запросы.

Мирослав С.

Автор статей, ИБ-специалист