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. За разлика от IF…ELSE, където е разрешено само максимумът от едно условие, CASE позволява на потребителя да приложи множество условия за извършване на различни набори от действия в MS SQL. Той връща съответна стойност, свързана с условието, дефинирано от потребителя.

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

In MS SQL, има два вида CASE.

  1. Обикновен СЛУЧАЙ
  2. Търсен 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 обозначава израза, с който в крайна сметка ще бъдем сравнени Стойност_1, Стойност_2, ...
  • Параметрите Изявление_1, Изявление_2… обозначават изразите, които ще бъдат изпълнени, ако Case_Expression = Стойност_1, Регистър_израз = Стойност_2, … и така нататък.
  • С две думи, състояние е дали Case_Expression = Value_N и ACTION е изпълнението на Statement_N, ако горният резултат е ВЯРЕН.
  • ALIAS_NAME не е задължително и е името на псевдонима, дадено на резултата от израза CASE на SQL Server. Най-често се използва, когато използваме регистър в клауза за избор на SQL сървър.

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

  • Simple Case позволява само проверка за равенство на Case_Expression със Стойност_1 до Стойност_N.
  • Case_Expression се сравнява със стойността по ред, започвайки от първата стойност, т.е. Value_1. По-долу е подходът за изпълнение:
  • Ако Case_Expression е еквивалентен на Value_1, тогава следващите изрази WHEN…THEN се пропускат и изпълнението на CASE ще ПРИКЛЮЧИ незабавно.
  • Ако Case_Expression не съвпада със Стойност_1, тогава Case_Expression се сравнява със Стойност_2 за еквивалентност. Този процес на сравняване на Case_Expression със стойност ще продължи, докато Case_Expression не намери съответстваща еквивалентна стойност от набора от Value_1, Value_2,...
  • Ако нищо не съвпада, тогава контролът преминава към оператора ELSE и Statement_Else ще бъде изпълнен.
  • ELSE не е задължително.
  • Ако ELSE не присъства и Case_Expression не съвпада с нито една от стойностите, тогава Ще се покаже нула.

Диаграмата по-долу илюстрира потока на изпълнение на Simple Case.

Работа на оператора Simple Case
Работа на оператора Simple Case

Примери

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

Прост случай в SQL Server

Ще използваме "Guru99" таблица в следващите примери

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

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

Прост случай в SQL Server

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

Прост случай в SQL Server

Търсен 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.
  • Накратко, Condition е Boolean_Expression_1,… и ACTION е изпълнението на Statement_N, ако горният boolean_Expression_1 е TRUE.
  • ALIAS_NAME не е задължително и е името на псевдонима, дадено на резултата от израза CASE. Използва се предимно, когато използваме CASE в клаузата за избор.

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

  • За разлика от простия случай, Searched Case не е ограничен само до проверка за равенство, но позволява булев израз.
  • Булевият израз се оценява по ред, като се започне от първия булев израз, т.е. Boolean_expression_1. По-долу е подходът за изпълнение:
    • Ако Boolean_expression_1 е TRUE, тогава следващи изрази WHEN…THEN се пропускат и изпълнението на CASE ще ПРИКЛЮЧИ незабавно.
    • Ако Boolean_expression_1 е FALSE, тогава Boolean_expression_2 се оценява за условие TRUE. Този процес на оценяване на Boolean_expression ще продължи, докато един от Boolean_expression върне TRUE.
    • Ако нищо не съвпада, тогава контролът преминава към оператора ELSE и Statement_Else ще бъде изпълнен.
  • Like Simple Case ELSE не е задължително и в Search case.
  • Ако ELSE не присъства и никой от Boolean_expression не връща TRUE, тогава ще се покаже Null.

По-долу Диаграма илюстрират потока на изпълнение на Търсен случай.

Работа на Изявление за търсен случай

Работа на Изявление за търсен случай

Примери

Заявка 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 пример в SQL Server

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

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

Търсен CASE в SQL Server

Разлика между подхода за изпълнение: 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

Тук „Име на урока“ е част от израза CASE в SQL. Тогава „Име на урока“ стойността се сравнява с всяка WHEN стойности, т.е. 'SQL'… докато 'Tutorial_name' съвпада със стойностите WHEN.

Напротив, СЛУЧАЙ ЗА ТЪРСЕНЕ пример няма 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.

Разлика между прост и търсен случай

Прост случай Търсен случай
Ключовата дума CASE е непосредствено последвана от CASE_Expression и преди оператора WHEN.

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

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

Например:
СЛУЧАЙ КОГАТО ТОГАВА Изявление_1…

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

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

В Searched Case Boolean_Expression съществува за всеки оператор WHEN. Този Boolean_Expressions: Boolean_Expression_1, Boolean_Expression_2,… оценява условието TRUE/FALSE за всеки израз WHEN.

Например:
CASE
КОГА ТОГАВА Изявление_1…
КОГА ТОГАВА Изявление_2…

Simple Case поддържа само проверка за равенство. Т.е. дали CASE_Expression = VALUE_1, VALUE_2…

Например:
СЛУЧАЙ WHEN Value_1 THEN Statement_1… В горния пример единствената операция, извършвана от системата, е проверка дали Case_Expression = Value_1

С Boolean_Expression_N, Search Case поддържа всяка операция, която води до булева стойност. Той включва оператор равен и не равен на.

Например:
СЛУЧАЙ КОГАТО THEN Statement_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 и условието if Case SQL сървър е False, тогава операторът ELSE ще се изпълни.

В противен случай съдържа вложен оператор CASE в SQL. В зависимост от стойността на самолетния билет ще се покаже един от следните резултати:

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

Вложен CASE в SQL Server

Вложен 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 ще се изпълни.

В зависимост от стойността на самолетния билет ще се покаже един от следните резултати:

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

Пример за вложен CASE в SQL Server

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

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

CASE с UPDATE в SQL Server

Ще използваме таблица „Guru99“ в следващите примери

Можем да използваме 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 в SQL Server

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

CASE с UPDATE в SQL Server

КАЛЪФ с Поръчай по

Можем да използваме 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 и като първи КОГАТО булевият израз се изчисли като TRUE, Tutorial_ID е избран за Order by Condition

CASE с Order by в SQL Server

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

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

Oбобщение

  • В MS SQL има два типа CASE: Simple CASE и Searched CASE
  • ELSE не е задължително в оператора CASE.