В этом руководстве вы узнаете, как использовать выражение 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;
Вот что получилось:
Значения в столбце 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;
На следующем рисунке показан результат:
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;
Вот что получилось:
В этом примере:
- Во-первых, условие в пункте 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 для добавления логики if-else в SQL-запросы.