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.
- Обикновен СЛУЧАЙ
- Търсен 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.
Примери
Предположение: Да приемем, че имаме таблицата като "Guru99" с две колони и четири реда, както е показано по-долу:
Ще използваме "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
Резултат: Диаграмата по-долу обяснява потока на изпълнение на ПРОСТ СЛУЧАЙ без ДРУГО.
Заявка 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
Синтаксисът за търсен регистър
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
Резултат: Диаграмата по-долу обяснява потока на изпълнение от ТЪРСЕН СЛУЧАЙ с НЯМА ДРУГО.
Заявка 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 ТЪРСЕНОТО ДЕЛО с ДРУГО.
Разлика между подхода за изпълнение: 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.
Например: |
Ключовата дума Case е последвана от оператора WHEN и няма израз между CASE и WHEN.
Например: |
В прост случай СТОЙНОСТ съществува за всеки оператор WHEN. Тези стойности: Value_1, Value_2… Сравняват се последователно с един CASE_Expression. Резултатът се оценява за условието TRUE/FALSE за всеки израз WHEN.
Например: |
В Searched Case Boolean_Expression съществува за всеки оператор WHEN. Този Boolean_Expressions: Boolean_Expression_1, Boolean_Expression_2,… оценява условието TRUE/FALSE за всеки израз WHEN.
Например: |
Simple Case поддържа само проверка за равенство. Т.е. дали CASE_Expression = VALUE_1, VALUE_2…
Например: |
С Boolean_Expression_N, Search Case поддържа всяка операция, която води до булева стойност. Той включва оператор равен и не равен на.
Например: |
Вложен 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: 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 с АКТУАЛИЗАЦИЯ
Предположение: Да приемем, че имаме таблицата като „Guru99“ с две колони и четири реда, както е показано по-долу:
Ще използваме таблица „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'
Нека направим запитване към таблицата Guru99, за да проверим актуализираната стойност:
КАЛЪФ с Поръчай по
Можем да използваме 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 може да бъде вложен в друг CASE, както и в друг оператор IF…ELSE.
- В допълнение към SELECT, CASE може да се използва с друг SQL клауза като UPDATE, ORDER BY.
Oбобщение
- В MS SQL има два типа CASE: Simple CASE и Searched CASE
- ELSE не е задължително в оператора CASE.