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

⚡ Умно обобщение

CASE е условен израз в SQL Server, който връща стойност въз основа на първото условие, което се оценява като true, предлагайки Simple и Searched форми плюс влагане в IF…ELSE, UPDATE и ORDER BY.

  • 🧭 Условна стойност: Изразът CASE връща стойност, която зависи от това кое WHEN условие е първото, което се оценява като истина.
  • 1️⃣ Прост СЛУЧАЙ: Простият CASE сравнява един израз със списък от стойности и изпълнява проверка за равенство за всеки WHEN.
  • ???? Търсен СЛУЧАЙ: Търсеният CASE оценява отделен булев израз за всеки WHEN, поддържайки диапазони и оператори за неравенство.
  • ➖ ИНАЧЕ е по избор: Когато няма съвпадения 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 долара, тогава ще посетя Европа.
  • В противен случай бих предпочел да посетя някоя близка туристическа дестинация.

Нека разгледаме категоризирането на условието и действието поотделно от горния пример:

Условия – Самолетни билети Действия, извършени само ако условието е TRUE
Less от $ 100 Посетете Лос Анджелис
Между $ до $ 100 200 Посетете Ню Йорк
Между $ до $ 200 400 Посетете Европа
Нито едно от горните условия не е изпълнено Близо туристическо място

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

Какво е CASE Statement в SQL Server?

CASE Изявление в SQL Server е продължението на АКО... ИНАЧЕ оператор. За разлика от IF…ELSE, където е разрешено максимум едно условие, CASE позволява на потребителя да прилага множество условия за изпълнение на различни набори от действия в MS SQL. Връща съответстваща стойност, свързана с условието, дефинирано от потребителя.

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

  • Обикновен СЛУЧАЙ
  • Търсен 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, ако горният резултат е TRUE.
  • ALIAS_NAME е незадължителен и е псевдонимът, даден на резултата от SQL Server CASE оператор. Използва се най-вече, когато използваме CASE в SQL Server SELECT клаузата.

Правила за прост случай

  • 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 стойност по ред

Примери

Да предположим, че имаме таблица с име „Guru99' с две колони, Tutorial_ID и Tutorial_name, и четири реда, както е показано по-долу. Ще използваме това 'Guru99' таблица в следващите примери.

Проба Guru99 таблица с колони 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, показващ a Descriptйон за всяко име_на_урока

Заявка 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.

Резултат от Simple CASE с ELSE, връщащ текста по подразбиране за несъответстващи редове

Търсен CASE

Синтаксисът за търсен регистър

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.
  • Накратко, условието е Булев_израз_1… и действието е изпълнението на Statement_N, ако горният Булев_израз_1 е TRUE.
  • ALIAS_NAME е незадължителен и е псевдонимът, даден на резултата от оператора CASE. Използва се най-вече, когато използваме CASE в клаузата SELECT.

Правила за претърсен случай

  • За разлика от простия случай, търсеният случай не е ограничен само до проверка за равенство, а позволява и булев израз.
  • Булевият израз се изчислява по ред, започвайки от първия булев израз, т.е. Булев_Израз_1. По-долу е показан подходът към изпълнението:
  • Ако Boolean_Expression_1 е TRUE, тогава допълнителните WHEN…THEN оператори се пропускат и изпълнението на CASE ще END незабавно.
  • Ако Булев_израз_1 е НЕВЯРЕН (FALSE), тогава Булев_израз_2 се оценява за условие ИСТИНСКО (TRUE). Този процес на оценяване на булевия израз продължава, докато един от булевите изрази не върне ИСТИНСКО (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

Резултат: Диаграмата по-долу обяснява потока на изпълнение на ТЪРСЕНИЯ СЛУЧАЙ БЕЗ ДРУГО.

Резултат от търсен CASE без ELSE, съответстващ на всяко Tutorial_name с Descriptйон

Заявка 2: ТЪРСЕЕН СЛУЧАЙ с опцията 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

Нека разгледаме примера с ПРОСТ СЛУЧАЙ по-долу:

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_Expression и е преди оператора WHEN.

Например:
СЛУЧАЙ
WHEN Value_1 THEN Statement_1…

Ключовата дума CASE е последвана от оператора WHEN и няма израз между CASE и WHEN.

Например:
СЛУЧАЙ, КОГАТО ТОГАВА Твърдение_1…

В един прост случай, за всяко WHEN изречение съществува стойност (VALUE). Тези стойности (Value_1, Value_2…) се сравняват последователно с един CASE_Expression. Резултатът се оценява за условието TRUE/FALSE за всяко WHEN изречение.

Например:
СЛУЧАЙ
WHEN Value_1 THEN Statement_1…
WHEN Value_2 THEN Statement_2…

В търсен случай съществува булев_израз (Boolean_Expression) за всеки WHEN оператор. Тези булеви изрази (Boolean_Expression_1, Boolean_Expression_2…) оценяват условието TRUE/FALSE за всеки WHEN оператор.

Например:
CASE
КОГА ТОГАВА Изявление_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 оператор. Декларираме a променлив за самолетния билет и разклонението му върху неговата стойност. По-долу е даден примерният 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 е False, тогава се изпълнява операторът ELSE. Частта ELSE съдържа вложен оператор CASE в SQL. В зависимост от стойността на самолетния билет се показва един от следните резултати:

  • Системата отпечатва „Посетете близко туристическо място“, ако самолетните билети са > $400.
  • Системата отпечатва „Посетете Лос Анджелис“, ако самолетните билети са МЕЖДУ $0 И $100.
  • Системата отпечатва „Посетете Ню Йорк“, ако самолетните билети са МЕЖДУ $101 И $200.
  • Системата отпечатва „Visit Europe“, ако самолетните билети са МЕЖДУ $201 И $400.

Резултатът по-долу показва местоположението, върнато, когато вложеният CASE се изпълни в клона ELSE:

Резултат от CASE, вложен в IF…ELSE, отпечатващ местоположението на посещението за билета

Вложен CASE: CASE в CASE

Можем да използваме CASE вътре в друг CASE в SQL. По-долу е даден примерен 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

CASE с АКТУАЛИЗАЦИЯ

Да приемем отново, че имаме 'Guru99-футова таблица с две колони и четири реда, както е показано по-долу:

Guru99 таблица преди CASE UPDATE, показваща оригиналните стойности на 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 на 'Структуриран език за заявки'.
  • Ако 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 на Guru99 маса

Нека попитаме „Guru99' таблица за проверка на актуализираните стойности:

Guru99 таблица след АКТУАЛИЗАЦИЯТА НА СЛУЧАЯ, показваща новите стойности на 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, Tutorial_ID се избира за условието ORDER BY. Резултатът е показан по-долу:

Резултат от ORDER BY с израз CASE, сортиращ Guru99 таблица от Tutorial_ID

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

  • CASE може да бъде вложен в друг CASE, както и в оператор IF…ELSE.
  • В допълнение към SELECT, CASE може да се използва с други SQL клаузи, като UPDATE и ORDER BY.

Въпроси и Отговори

IIF() е съкращение за CASE израз с два резултата: той връща една стойност, когато условието е истина, и друга, когато е неистина. Пълният CASE израз е по-гъвкав и може да тества много WHEN условия в едно твърдение.

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

Да. Поставянето на CASE израз вътре в SUM(), COUNT() или AVG() извършва условно агрегиране, сумирайки или преброявайки само редовете, които отговарят на всяко условие WHEN. Тази техника често се използва за изграждане на обобщени отчети в стил Pivot.

COALESCE и ISNULL връщат само първата стойност, различна от NULL, от списък. CASE изразът е по-широк: той оценява произволни булеви условия или съвпадения на стойности и връща резултата от първия разклон, който е true.

Изразът CASE връща един тип данни. SQL Server го определя от приоритета на типа данни на всеки резултат THEN и ELSE, така че всички клонове трябва да връщат съвместими типове, за да се избегнат грешки при преобразуване.

Да. Израз CASE може да се появи в оператора SELECT на изглед и навсякъде в съхранена процедура, функция или тригер. Същият синтаксис на израза работи за всички тези обекти.

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

Асистентите с изкуствен интелект и машинно обучение превеждат правилата на обикновен английски език в прости или търсени CASE изрази, предлагат липсващи WHEN клонове и сигнализират за припокриване.ping или недостижими условия. Разработчикът преглежда всяко предложение за коректност, преди да го внедри.

Обобщете тази публикация с: