Оператор CASE и вложенный случай в SQL Server: пример T-SQL

⚡ Умное резюме

CASE — это условное выражение в SQL Server, которое возвращает значение в зависимости от того, выполняется ли первое условие и является ли оно истинным. Доступны простые и поисковые формы, а также вложенность внутри операторов IF…ELSE, UPDATE и ORDER BY.

  • 🧭 Условное значение: Выражение CASE возвращает значение, зависящее от того, какое условие WHEN первым будет признано истинным.
  • 1️⃣ Простой пример: Функция Simple CASE сравнивает одно выражение со списком значений и выполняет проверку на равенство для каждого условия WHEN.
  • 🔎 Поиск по делу: Функция Searched CASE вычисляет отдельное логическое выражение для каждого WHEN, поддерживая диапазоны и операторы неравенства.
  • ELSE — необязательный параметр: Если условие WHEN не выполняется и условие ELSE опущено, выражение CASE возвращает NULL.
  • 🪆 Вложенность: Оператор CASE может быть вложен в другой оператор CASE, а также в оператор IF…ELSE для многоуровневой логики.
  • 🔧 Помимо SELECT: Помимо оператора SELECT, оператор CASE работает с предложениями UPDATE и ORDER BY для управления условными обновлениями и сортировкой.

Оператор CASE и вложенный оператор CASE в SQL Server на примерах T-SQL

Обзор Кейса в реальной жизни!

Опять же, в реальной жизни мы совершаем разные действия в зависимости от исхода различных условий. Для большей наглядности рассмотрим пример ниже:

  • Если авиабилеты будут стоить меньше 100 долларов, то я поеду в Лос-Анджелес.
  • Если авиабилеты будут стоить от 100 до 200 долларов, то я поеду в Нью-Йорк.
  • Если авиабилеты будут стоить от 200 до 400 долларов, то я поеду в Европу.
  • В противном случае я предпочту посетить близлежащее туристическое место.

Рассмотрим, в отличие от приведенного выше примера, разделение условия и действия на отдельные категории:

Условия – Авиабилеты Действия выполняются только в том случае, если условие истинно.
Less чем $ 100 Посетите Лос-Анджелес
От $ 100 до $ 200 Посетите Нью-Йорк
От $ 200 до $ 400 Посетите Европу
Ни одно из вышеперечисленных условий не выполнено Рядом туристическое место

В приведенном выше примере мы видим, что результат различных условий определяет отдельное действие. Например, посетитель совершит поездку в Нью-Йорк только при условии, что стоимость авиабилета составляет от 100 до 200 долларов. Аналогично, MS SQL Оператор CASE также предоставляет возможность выполнять различные операторы T-SQL в зависимости от результатов различных условий.

Что такое оператор CASE в SQL Server?

Заявление CASE в SQL Server является расширением ЕСЛИ ЕЩЕ Оператор CASE. В отличие от IF…ELSE, где допускается максимум одно условие, CASE позволяет пользователю применять несколько условий для выполнения различных наборов действий в MS SQL. Он возвращает соответствующее значение, связанное с условием, определенным пользователем.

Давайте научимся использовать оператор CASE в SQL и его концепцию в следующих разделах. В MS SQL существует два типа операторов CASE:

  • Простой СЛУЧАЙ
  • Поиск ДЕЛА

Простой СЛУЧАЙ

Синтаксис для простого случая

CASE <Case_Expression>
     WHEN Value_1 THEN Statement_1
     WHEN Value_2 THEN Statement_2
     .
     .
     WHEN Value_N THEN Statement_N
     [ELSE Statement_Else]   
END AS [ALIAS_NAME]

Вот:

  • Параметр Case_Expression обозначает выражение, которое в конечном итоге будет сравниваться со значениями Value_1, Value_2 и так далее.
  • Параметры Statement_1, Statement_2… обозначают операторы, которые будут выполнены, если Case_Expression = Value_1, Case_Expression = Value_2 и так далее.
  • Вкратце, условие заключается в том, равно ли Case_Expression значению Value_N, а действие — в выполнении Statement_N, если указанный выше результат истинен.
  • Параметр ALIAS_NAME является необязательным и представляет собой псевдоним, присваиваемый результату оператора CASE в SQL Server. Он чаще всего используется, когда мы применяем CASE в предложении SELECT SQL Server.

Правила для простого случая

  • В режиме Simple Case допускается только проверка равенства выражения Case_Expression со значениями от Value_1 до Value_N.
  • Выражение Case_Expression сравнивается со значением в порядке возрастания, начиная с первого значения, то есть Value_1. Ниже описан подход к выполнению:
  • Если Case_Expression эквивалентно Value_1, то дальнейшие инструкции WHEN…THEN пропускаются, и выполнение CASE немедленно ЗАКОНЧИТСЯ.
  • Если Case_Expression не совпадает со значением Value_1, то Case_Expression сравнивается со значением Value_2 для проверки эквивалентности. Этот процесс сравнения Case_Expression со значением продолжается до тех пор, пока Case_Expression не найдет соответствующее эквивалентное значение из набора Value_1, Value_2 и так далее.
  • Если совпадений нет, управление переходит к оператору ELSE, и выполняется Statement_Else.
  • ELSE не является обязательным.
  • Если параметр ELSE отсутствует и Case_Expression не соответствует ни одному из значений, отображается NULL.

Приведенная ниже диаграмма иллюстрирует последовательность выполнения простого кейса:

Блок-схема, показывающая, как простой CASE оценивает каждое значение WHEN по порядку.

Примеры

Предположим, у нас есть таблица с именем 'Guru'99' с двумя столбцами, Tutorial_ID и Tutorial_name, и четырьмя строками, как показано ниже. Мы будем использовать этот 'GuruТаблица 99 приведена в следующих примерах.

Образец GuruТаблица 99 с столбцами Tutorial_ID и Tutorial_name и четырьмя строками.

Запрос 1: ПРОСТОЙ СЛУЧАЙ с опцией NO ELSE

SELECT Tutorial_ID, Tutorial_name,
CASE Tutorial_name
	WHEN 'SQL' THEN 'SQL is developed by IBM'
	WHEN 'PL/SQL' THEN 'PL/SQL is developed by Oracle Corporation.'
	WHEN 'MS-SQL' THEN 'MS-SQL is developed by Microsoft Corporation.'
END AS Description
FROM Guru99

Результат: Приведенная ниже диаграмма объясняет последовательность выполнения ПРОСТОГО СЛУЧАЯ БЕЗ КАКИХ-ЛИБО ДРУГИХ УСЛОВИЙ.

Результат простого CASE без ELSE, демонстрирующий Descriptион для каждого Tutorial_name

Запрос 2: SIMPLE CASE с опцией ELSE

SELECT Tutorial_ID, Tutorial_name,
CASE Tutorial_name
	WHEN 'SQL' THEN 'SQL is developed by IBM'
	WHEN 'PL/SQL' THEN 'PL/SQL is developed by Oracle Corporation.'
	WHEN 'MS-SQL' THEN 'MS-SQL is developed by Microsoft Corporation.'
	ELSE 'This is NO SQL language.'
END AS Description
FROM Guru99

Результат: Приведенная ниже диаграмма объясняет последовательность выполнения оператора SIMPLE CASE с оператором ELSE.

Результат выполнения простого оператора CASE с оператором ELSE, возвращающий текст по умолчанию для строк, не соответствующих заданным параметрам.

Поиск ДЕЛА

Синтаксис поиска по регистру

CASE 
     WHEN <Boolean_Expression_1> THEN Statement_1
     WHEN <Boolean_Expression_2> THEN Statement_2
     .
     .
     WHEN <Boolean_Expression_N> THEN Statement_N
     [ELSE Statement_Else]   
END AS [ALIAS_NAME]

Вот:

  • Параметр Boolean_Expression_1… обозначает выражение, которое будет оцениваться как TRUE или FALSE.
  • Параметры Statement_1, Statement_2… обозначают операторы, которые будут выполнены, если соответствующий результат Boolean_Expression_1, Boolean_Expression_2 равен TRUE.
  • Вкратце, условие — это логическое выражение Boolean_Expression_1…, а действие — выполнение оператора Statement_N, если указанное выше логическое выражение Boolean_Expression_1 истинно.
  • Параметр ALIAS_NAME является необязательным и представляет собой псевдоним, присваиваемый результату оператора CASE. Он чаще всего используется, когда мы применяем CASE в предложении SELECT.

Правила для разыскиваемого дела

  • В отличие от простого случая, случай поиска не ограничивается только проверкой на равенство, а допускает использование логических выражений.
  • Логическое выражение вычисляется по порядку, начиная с первого логического выражения, т.е. Boolean_Expression_1. Ниже описан подход к выполнению:
  • Если Boolean_Expression_1 имеет значение TRUE, то дальнейшие операторы WHEN…THEN пропускаются, и выполнение CASE немедленно завершается.
  • Если Boolean_Expression_1 равно FALSE, то Boolean_Expression_2 проверяется на истинность. Этот процесс проверки логических выражений продолжается до тех пор, пока одно из логических выражений не вернет TRUE.
  • Если совпадений нет, управление переходит к оператору ELSE, и выполняется Statement_Else.
  • Как и в простом случае, в случае поиска оператор ELSE является необязательным.
  • Если оператор ELSE отсутствует и ни одно из логических выражений не возвращает TRUE, то отображается NULL.

Приведенная ниже диаграмма иллюстрирует последовательность выполнения поиска по делу:

Блок-схема, показывающая, как поисковый CASE последовательно оценивает каждое логическое выражение.

Примеры

Запрос 1: ПОИСК СЛУЧАЯ с опцией NO ELSE

SELECT Tutorial_ID, Tutorial_name,
CASE 
 	WHEN Tutorial_name = 'SQL' THEN 'SQL is developed by IBM'
	WHEN Tutorial_name = 'PL/SQL' THEN 'PL/SQL is developed by Oracle Corporation.'
	WHEN Tutorial_name = 'MS-SQL' THEN 'MS-SQL is developed by Microsoft Corporation.'
END AS Description
FROM Guru99

Результат: На приведенной ниже диаграмме показана последовательность выполнения запроса SEARCHED CASE без каких-либо дополнительных условий.

Результат поиска по CASE без ELSE, сопоставляющий каждое Tutorial_name с Descriptион

Запрос 2: Поиск по типу Case с опцией ELSE

SELECT Tutorial_ID, Tutorial_name,
CASE 
	WHEN Tutorial_name = 'SQL' THEN 'SQL is developed by IBM'
	WHEN Tutorial_name = 'PL/SQL' THEN 'PL/SQL is developed by Oracle Corporation.'
	WHEN Tutorial_name = 'MS-SQL' THEN 'MS-SQL is developed by Microsoft Corporation.'
	ELSE 'This is NO SQL language.'
END AS Description
FROM Guru99

Результат: На приведенной ниже диаграмме показана последовательность выполнения запроса SEARCHED CASE с оператором ELSE.

Результат поиска с использованием оператора CASE и оператора ELSE, возвращающий текст по умолчанию для языков, отличных от SQL.

Разница между подходами к выполнению: SIMPLE и SEARCH CASE

Рассмотрим пример SIMPLE CASE ниже:

SELECT Tutorial_ID, Tutorial_name,
CASE Tutorial_name
	WHEN 'SQL' THEN 'SQL is developed by IBM'
	WHEN 'PL/SQL' THEN 'PL/SQL is developed by Oracle Corporation.'
	WHEN 'MS-SQL' THEN 'MS-SQL is developed by Microsoft Corporation.'
	ELSE 'This is NO SQL language.'
END AS Description
FROM Guru99

Здесь 'Tutorial_name' является частью выражения CASE в SQL. Затем значение 'Tutorial_name' сравнивается с каждым значением WHEN, т.е. 'SQL'… до тех пор, пока 'Tutorial_name' не совпадет со значением WHEN.

Напротив, в примере SEARCH CASE нет выражения CASE:

SELECT Tutorial_ID, Tutorial_name,
CASE 
 	WHEN Tutorial_name = 'SQL' THEN 'SQL is developed by IBM'
	WHEN Tutorial_name = 'PL/SQL' THEN 'PL/SQL is developed by Oracle Corporation.'
	WHEN Tutorial_name = 'MS-SQL' THEN 'MS-SQL is developed by Microsoft Corporation.'
END AS Description
FROM Guru99

Здесь каждое выражение WHEN имеет собственное условное логическое выражение. Каждое логическое выражение, например, Tutorial_name = 'SQL'…, оценивается на TRUE/FALSE до тех пор, пока первое логическое выражение не окажется TRUE.

Разница между простым и поисковым случаем

Простой случай Разыскиваемое дело
За ключевым словом CASE сразу следует выражение CASE, а перед ним — оператор WHEN.

Например:
СЛУЧАЙ
КОГДА Значение_1 ТОГДА Оператор_1…

За ключевым словом CASE следует оператор WHEN, и между CASE и WHEN нет никакого выражения.

Например:
СЛУЧАЙ, КОГДА Затем утверждение_1…

В простом случае для каждого оператора WHEN существует значение VALUE. Эти значения (Value_1, Value_2…) последовательно сравниваются с одним выражением CASE. Результат оценивается на соответствие условию TRUE/FALSE для каждого оператора WHEN.

Например:
СЛУЧАЙ
КОГДА Значение_1 ТОГДА Оператор_1…
КОГДА Значение_2 ТОГДА Оператор_2…

В поисковом запросе для каждого оператора WHEN существует логическое выражение (Boolean_Expression). Эти логические выражения (Boolean_Expression_1, Boolean_Expression_2…) оценивают условие TRUE/FALSE для каждого оператора WHEN.

Например:
Кейсы
КОГДА ТОГДА Утверждение_1…
КОГДА ТОГДА Утверждение_2…

В простом случае выполняется только проверка на равенство, то есть, равно ли CASE_Expression значению VALUE_1, VALUE_2 и т.д.

Например:
СЛУЧАЙ КОГДА Значение_1 ТОГДА Утверждение_1…
В приведенном выше примере единственная операция, выполняемая системой, — это проверка, равно ли Case_Expression значению Value_1.

С параметром Boolean_Expression_N поисковый запрос поддерживает любые операции, результатом которых является логическое значение. Это включает операторы равенства и неравенства.

Например:
СЛУЧАЙ, КОГДА Затем утверждение_1…
В приведенном выше примере Boolean_Expression_1 может содержать как оператор «равно», так и оператор «не равно», например, A = B, A != B.

Вложенный CASE: CASE в IF ELSE

Мы можем использовать CASE внутри оператора IF…ELSE. Мы объявляем переменная Для авиабилета и перехода на следующий уровень в зависимости от его стоимости. Ниже приведен пример кода MS-SQL:

DECLARE @Flight_Ticket int;
SET @Flight_Ticket = 190;
IF @Flight_Ticket > 400
   PRINT 'Visit Nearby Tourist Location';
ELSE 
BEGIN
    SELECT
	CASE 
	WHEN @Flight_Ticket BETWEEN 0 AND 100 THEN 'Visit Los Angeles'
	WHEN @Flight_Ticket BETWEEN 101 AND 200 THEN 'Visit New York'
	WHEN @Flight_Ticket BETWEEN 201 AND 400 THEN 'Visit Europe'
	END AS Location	
END

В приведенном выше примере оператор CASE вложен в оператор IF…ELSE. Сначала выполняется оператор IF, и если условие CASE в SQL Server ложно, то выполняется оператор ELSE. Часть ELSE содержит вложенный оператор CASE в SQL. В зависимости от стоимости авиабилета отображается один из следующих результатов:

  • Если стоимость авиабилетов превышает 400 долларов, система выводит сообщение «Посетите близлежащее туристическое место».
  • Система выводит надпись «Посетите Лос-Анджелес», если стоимость авиабилетов находится в диапазоне от 0 до 100 долларов.
  • Система выводит надпись «Посетите Нью-Йорк», если стоимость авиабилетов находится в диапазоне от 101 до 200 долларов.
  • Система выводит надпись «Посетите Европу», если стоимость авиабилетов составляет от 201 до 400 долларов.

Приведённый ниже результат показывает местоположение, возвращаемое при выполнении вложенного оператора CASE внутри ветви ELSE:

Результат выполнения оператора CASE, вложенного в оператор IF…ELSE, выводит место посещения, указанное в билете.

Вложенный CASE: CASE внутри CASE

В SQL можно использовать оператор CASE внутри другого оператора CASE. Ниже приведён пример кода MS-SQL:

DECLARE @Flight_Ticket int;
SET @Flight_Ticket = 250;
SELECT
CASE 
WHEN @Flight_Ticket >= 400 THEN 'Visit Nearby Tourist Location.'
WHEN @Flight_Ticket < 400 THEN 
    	CASE 
		WHEN @Flight_Ticket BETWEEN 0 AND 100 THEN 'Visit Los Angeles'
		WHEN @Flight_Ticket BETWEEN 101 AND 200 THEN 'Visit New York'
		WHEN @Flight_Ticket BETWEEN 201 AND 400 THEN 'Visit Europe'
		END	
END AS Location

В приведенном выше примере оператор CASE вложен в другой оператор CASE. Система сначала выполняет внешний оператор CASE; если Flight_Ticket < $400, выполняется внутренний оператор CASE. Возвращаемое местоположение соответствует тем же диапазонам цен билетов, что и в предыдущем примере, поэтому билет за $250 попадает в диапазон $201–$400 и возвращает «Visit Europe».

В приведенном ниже результате показано местоположение, возвращенное внутренним запросом CASE для билета стоимостью 250 долларов:

Результат выполнения одного CASE, вложенного в другой CASE, возвращающий Visit Europe для билета за 250.

ДЕЛО с ОБНОВЛЕНИЕМ

Предположим еще раз, что у нас есть 'GuruТаблица 99' с двумя столбцами и четырьмя строками, как показано ниже:

GuruТаблица 99 до обновления CASE, отображающая исходные значения Tutorial_Name.

Мы можем использовать CASE с UPDATE. Ниже приведен пример кода MS-SQL:

UPDATE Guru99
SET Tutorial_Name = 
	(
	CASE
	WHEN Tutorial_Name = 'SQL' THEN 'Structured Query language.'
	WHEN Tutorial_Name = 'PL/SQL' THEN 'Oracle PL/SQL'
	WHEN Tutorial_Name = 'MSSQL' THEN 'Microsoft SQL.'
	WHEN Tutorial_Name = 'Hadoop' THEN 'Apache Hadoop.'
	END
	)

В приведенном выше примере оператор CASE используется в операторе UPDATE. В зависимости от значения Tutorial_Name, столбец Tutorial_Name обновляется значением из оператора THEN:

  • Если Tutorial_Name = 'SQL', то измените Tutorial_Name на 'Structured Query language'.
  • Если Tutorial_Name = 'PL/SQL', то измените Tutorial_Name на 'Oracle PL/SQL'.
  • Если Tutorial_Name = 'MSSQL', то измените Tutorial_Name на 'Microsoft SQL'.
  • Если Tutorial_Name = 'Hadoop', то измените Tutorial_Name на 'Apache Hadoop'.

Выполнение запроса обновляет соответствующие строки, как показано ниже:

Результат выполнения оператора CASE UPDATE GuruТаблица 99

Давайте зададим вопрос о 'GuruИспользуйте таблицу 99 для проверки обновленных значений:

GuruТаблица 99 после обновления CASE, отображающая новые значения Tutorial_Name.

СЛУЧАЙ с заказом по

Мы можем использовать оператор CASE с оператором ORDER BY. Ниже приведен пример кода MS-SQL:

Declare @Order Int;
Set @Order = 1
Select * from Guru99 order by 
CASE 
	WHEN @Order = 1 THEN Tutorial_ID
	WHEN @Order = 2 THEN Tutorial_Name
	END
DESC

Здесь оператор CASE используется с оператором ORDER BY. Параметр @Order установлен на 1, и поскольку первое логическое выражение WHEN оценивается как TRUE, для условия ORDER BY выбирается Tutorial_ID. Результат показан ниже:

Результат сортировки с помощью оператора ORDER BY и выражения CASE GuruТаблица 99 по Tutorial_ID

Интересные факты!

  • Оператор CASE может быть вложен в другой оператор CASE, а также в оператор IF…ELSE.
  • Помимо оператора SELECT, оператор CASE можно использовать и с другими SQL-запросами, такими как UPDATE и ORDER BY.

Часто задаваемые вопросы (FAQ)

Функция IIF() — это сокращенная запись выражения CASE с двумя исходами: она возвращает одно значение, когда условие истинно, и другое, когда ложно. Полное выражение CASE более гибкое и может проверять множество условий WHEN в одном операторе.

Да. Поскольку оператор CASE возвращает значение, он может использоваться в списке SELECT, предложении WHERE, предложении HAVING и операторе GROUP BY. В предложении WHERE оператор CASE позволяет применять различную логику фильтрации в зависимости от значений других столбцов.

Да. Использование выражения CASE внутри функций SUM(), COUNT() или AVGФункция () выполняет условное агрегирование, суммируя или подсчитывая только те строки, которые соответствуют каждому условию WHEN. Этот метод часто используется для построения сводных отчетов в виде сводных таблиц.

Функции COALESCE и ISNULL возвращают только первое ненулевое значение из списка. Выражение CASE имеет более широкую область применения: оно оценивает произвольные логические условия или совпадения значений и возвращает результат первой истинной ветви.

Выражение CASE возвращает единственный тип данных. SQL Server определяет его на основе приоритета типов данных в результатах операторов THEN и ELSE, поэтому все ветви должны возвращать совместимые типы во избежание ошибок преобразования.

Да. Выражение CASE может встречаться в операторе SELECT представления, а также в любом месте хранимой процедуры, функции или триггера. Синтаксис выражения одинаков для всех этих объектов.

Да. Второй пилот GitHub Можно создавать простые и поисковые выражения CASE, включая вложенные CASE и CASE внутри UPDATE, из командной строки на естественном языке. Всегда проверяйте условия WHEN, порядок ветвлений и обработку ELSE перед выполнением запроса.

Искусственный интеллект и помощники на основе машинного обучения переводят простые правила на английском языке в выражения типа Simple CASE или Searched CASE, предлагают отсутствующие ветви WHEN и отмечают перекрытия.ping или недостижимые условия. Разработчик проверяет каждое предложение на корректность перед его внедрением.

Подведем итог этой публикации следующим образом: