Naredba CASE & ugniježđeni slučaj u SQL Serveru: primjer T-SQL-a
Pregled slučaja u stvarnom životu!
Opet, u stvarnom životu izvodimo različite radnje ovisno o ishodu različitih uvjeta.
Da biste razradili više, razmotrite primjer u nastavku:
- Ako su karte za avion manje od 100 dolara, posjetit ću Los Angeles.
- Ako su karte za let između 100 i 200 dolara, onda ću posjetiti New York
- Ako su karte za let između 200 i 400 dolara, onda ću posjetiti Europu
- Inače ću radije posjetiti neko obližnje turističko mjesto.
Razmotrimo kategorizaciju uvjeta i radnji odvojeno od gornjeg primjera u nastavku:
Uvjeti - Avionske karte | Izvedene radnje, samo ako je Uvjet TRUE |
Less od 100 dolara | Posjetite Los Angeles |
Između $ $ 100 na 200 | Posjetite New York |
Između $ $ 200 na 400 | Posjetite Europu |
Niti jedan od gore navedenih uvjeta nije ispunjen | Obližnje turističko mjesto |
U gornjem primjeru možemo vidjeti da ishod različitih uvjeta upravlja zasebnim djelovanjem. Npr. Posjetitelj će izvršiti radnju posjeta New Yorku samo pod uvjetom da je cijena avionske karte između $100 i $200.
Slično tome, naredba MS SQL CASE također pruža mogućnost poduzimanja radnji izvršavanja različitih T-SQL naredbi na temelju ishoda različitih uvjeta.
Što je naredba CASE u SQL Serveru?
CASE iskaz u SQL Serveru je proširenje naredbe IF…ELSE. Za razliku od IF…ELSE, gdje je dopušten samo jedan maksimalni uvjet, CASE omogućuje korisniku primjenu više uvjeta za izvođenje različitih skupova radnji u MS SQL-u. Vraća odgovarajuću vrijednost povezanu s uvjetom koji definira korisnik.
Naučimo kako koristiti Case u SQL-u i njegov koncept u sljedećim odjeljcima.
In MS SQL, postoje dvije vrste CASE-a.
- Jednostavan SLUČAJ
- Pretraženi CASE
Jednostavan SLUČAJ
Sintaksa za jednostavan slučaj
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]
Ovdje,
- Parametar Case_Expression označava izraz s kojim ćemo se na kraju usporediti Vrijednost_1, Vrijednost_2, ...
- Parametri Izjava_1, Izjava_2… označavaju izjave koje će se izvršiti ako je Case_Expression = Vrijednost_1, mali_izraz = Vrijednost_2, … i tako dalje.
- Ukratko, stanje je li Case_Expression = Vrijednost_N i RADNJA je izvršenje Naredbe_N ako je gornji rezultat je TOČAN.
- ALIAS_NAME nije obavezan i predstavlja pseudonim koji se daje rezultatu naredbe SQL Server CASE. Uglavnom se koristi kada koristimo velika i mala slova u klauzuli odabira SQL poslužitelja.
Pravila za jednostavni slučaj
- Jednostavni slučaj dopušta samo provjeru jednakosti Case_Expression s Value_1 do Value_N.
- Case_Expression se uspoređuje s Value, redom počevši od prve vrijednosti, tj. Value_1. U nastavku je pristup izvršenju:
- Ako je Case_Expression ekvivalentan Value_1, daljnji WHEN…THEN iskazi se preskaču, a CASE će izvršenje odmah ZAVRŠITI.
- Ako se Case_Expression ne podudara s Value_1, onda se Case_Expression uspoređuje s Value_2 radi ekvivalentnosti. Ovaj proces usporedbe Case_Expression s Value nastavit će se sve dok Case_Expression ne pronađe odgovarajuću ekvivalentnu vrijednost iz skupa Value_1, Value_2,…
- Ako se ništa ne podudara, kontrola prelazi na naredbu ELSE, a naredba_Else će se izvršiti.
- ELSE nije obavezan.
- Ako ELSE nije prisutan i Case_Expression se ne podudara ni s jednom vrijednošću, tada Null će biti prikazan.
Donji dijagram ilustrira tijek izvršenja jednostavnog slučaja.
Primjeri
Pretpostavka: Pretpostavimo da imamo tablicu kao 'Guru99' s dva stupca i četiri retka kao što je prikazano u nastavku:
Koristit ćemo 'Guru99' tablicu u daljnjim primjerima
Upit 1: SIMPLE CASE s opcijom 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
Rezultat: Donji dijagram objašnjava tijek izvođenja JEDNOSTAVNOG SLUČAJA bez DRUGOG.
Upit 2: SIMPLE CASE s opcijom 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
Rezultat: Donji dijagram objašnjava tijek izvršavanja SIMPLE CASE s ELSE.
Pretraženi CASE
Sintaksa za traženi slučaj
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]
Ovdje,
- Parametar Boolean_Expression_1, … označava izraz koji će biti procijenjen za TRUE ili FALSE.
- Parametri Statement_1, Statement_2… označavaju izjave koje će se izvršiti ako je njihov odgovarajući Boolean_Expression_1, Boolean_Expression_2 rezultat TRUE.
- Ukratko, uvjet je Boolean_Expression_1,… a ACTION je izvršenje Statement_N ako je gornji Boolean_Expression_1 TRUE.
- ALIAS_NAME nije obavezan i to je pseudonim dat rezultatu naredbe CASE. Uglavnom se koristi kada koristimo CASE u klauzuli za odabir.
Pravila za traženi slučaj
- Za razliku od jednostavnog slučaja, Searched Case nije ograničen samo na provjeru jednakosti, već dopušta Booleov izraz.
- Booleov izraz se vrednuje redom počevši od prvog Booleovog izraza, tj. Boolean_expression_1. U nastavku je pristup izvršenju:
- Ako je Boolean_expression_1 TRUE, tada se dalji WHEN…THEN iskazi preskaču, a CASE izvršenje će odmah ZAVRŠITI.
- Ako je Boolean_expression_1 FALSE, tada se Boolean_expression_2 procjenjuje za TRUE uvjet. Ovaj proces procjene Boolean_expression nastavit će se sve dok jedan od Boolean_expression ne vrati TRUE.
- Ako se ništa ne podudara, kontrola prelazi na naredbu ELSE, a naredba_Else će se izvršiti.
- Like Simple Case ELSE je izboran i za pretraživanje.
- Ako ELSE nije prisutan i nijedan od Boolean_expression ne vraća TRUE, tada će se prikazati Null.
Dijagram ispod ilustrirati tijek izvršenja Traženi slučaj.
Primjeri
Upit 1: PRETRAŽENI SLUČAJ s opcijom 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
Rezultat: Donji dijagram objašnjava tijek izvršenja od PRETRAŽENI SLUČAJ s NEMA DRUGOG.
Upit 2: TRAŽENI PADEŽ s JOŠ opcija.
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
Rezultat: Donji dijagram objašnjava tijek izvršenja of PRETRAŽENI SLUČAJ s DRUGO.
Razlika između pristupa izvršenju: SIMPLE i SEARCH CASE.
Pogledajmo JEDNOSTAVAN SLUČAJ primjer ispod:
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
Ovdje, 'Naziv_vodiča' je dio CASE izraza u SQL-u. Zatim 'Naziv_vodiča' vrijednost se uspoređuje sa svakom WHEN vrijednosti, tj. 'SQL'… dok se 'Tutorial_name' ne podudara s vrijednostima WHEN.
Naprotiv, TRAŽI PADEŽ primjer nema CASE izraz:
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
Ovdje, svaki izjava KADA ima svoj Uvjetni Booleov izraz. Svaki Booleov izraz tj. Tutorial_name = 'SQL',… se procjenjuje za TOČNO NETOČNO dok prvi Boolean izraz koji procjenjuje na TRUE.
Razlika između jednostavnog i traženog padeža
Jednostavan slučaj | Traženi slučaj |
---|---|
Nakon ključne riječi CASE odmah slijedi CASE_Expression i ispred naredbe WHEN.
npr: |
Nakon ključne riječi Case slijedi naredba WHEN, a između CASE i WHEN nema izraza.
npr: |
U jednostavnom slučaju, VRIJEDNOST postoji za svaku izjavu WHEN. Ove vrijednosti: Value_1, Value_2… uspoređuju se s jednim CASE_Expression sekvencijalno. Rezultat se procjenjuje za TRUE/FALSE uvjet za svaku WHEN izjavu.
npr: |
U pretraživanom slučaju, Boolean_Expression postoji za svaku izjavu WHEN. Ovaj Boolean_Expressions: Boolean_Expression_1, Boolean_Expression_2,… procjenjuje TRUE/FALSE uvjet za svaku naredbu WHEN.
npr: |
Simple Case podržava samo provjeru jednakosti. Odnosno je li CASE_Expression = VALUE_1, VALUE_2…
npr: |
Uz Boolean_Expression_N, Search Case podržava svaku operaciju koja rezultira Booleovom vrijednošću. Uključuje operator jednako i nejednako.
npr: |
Ugniježđeni CASE: CASE u IF ELSE
Možemo koristiti CASE unutar IF ELSE. Ispod je primjer MS-SQL koda
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
U gornjem primjeru CASE je NESTED unutar IF…ELSE izjave:
Prvo će se izvršiti IF naredba i if Case Condition SQL poslužitelj je False, tada će se izvršiti naredba ELSE.
Inače sadrži ugniježđenu CASE naredbu u SQL-u. Ovisno o vrijednosti avionske karte, prikazat će se jedan od sljedećih rezultata:
- Sustav će ispisati 'Visit Nearby Tourist Location' ako su karte za avion >400 USD
- Sustav će ispisati "Posjetite Los Angeles" ako su karte za let IZMEĐU 0 I 100 USD
- Sustav će ispisati "Visit New York" ako su karte za let IZMEĐU 101 USD I 200 USD
- Sustav će ispisati "Visit Europe" ako su karte za let IZMEĐU 201 USD I 400 USD
Ugniježđeni CASE: CASE unutar CASE
Možemo koristiti CASE unutar CASE u SQL-u. Ispod je primjer MS-SQL koda
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
U gornjem primjeru CASE je UMIJEŠTEN unutar druge CASE naredbe:
Sustav počinje izvršavanjem vanjskog CASE-a. Ako je Flight_Ticket < $400 tada će se izvršiti unutarnji CASE.
Ovisno o vrijednosti avionske karte, prikazat će se jedan od sljedećih rezultata:
- Sustav će ispisati 'Visit Nearby Tourist Location' ako su karte za avion >400 USD
- Sustav će ispisati "Posjetite Los Angeles" ako su karte za let IZMEĐU 0 I 100 USD
- Sustav će ispisati "Visit New York" ako su karte za let IZMEĐU 101 USD I 200 USD
- Sustav će ispisati "Visit Europe" ako su karte za let IZMEĐU 201 USD I 400 USD
CASE s UPDATE
Pretpostavka: Pretpostavimo da imamo tablicu kao 'Guru99' s dva stupca i četiri retka kao što je prikazano u nastavku:
U daljnjim primjerima koristit ćemo tablicu 'Guru99'
Možemo koristiti CASE s UPDATE. Ispod je primjer MS-SQL koda:
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 )
U gornjem primjeru CASE se koristi u naredbi UPDATE.
Ovisno o vrijednosti Tutorial_Name, stupac Tutorial_Name će dobiti ažuriranje s vrijednošću izjave THEN.
- Ako je Tutorial_Name = 'SQL' ONDA ažurirajte Tutorial_Name na 'Structured Query language'
- Ako je Tutorial_Name = 'PL/SQL' ONDA ažurirajte Tutorial_Name na 'Oracle PL/SQL'
- Ako je Tutorial_Name = 'MSSQL' ONDA ažurirajte Tutorial_Name na 'Microsoft SQL'
- Ako je Tutorial_Name = 'Hadoop' ONDA ažurirajte Tutorial_Name u 'Apache Hadoop'
Upitajmo tablicu Guru99 da provjerimo ažuriranu vrijednost:
CASE s Naručite po
Možemo koristiti CASE s Order By. Ispod je primjer MS-SQL koda:
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
Ovdje se CASE koristi s Order By.
@Order je postavljen na 1 i kao prvi KADA Booleov izraz dobije vrijednost TRUE, Tutorial_ID je odabran za Order by Condition
Zanimljivosti!
- CASE se može ugniježditi u drugu CASE kao iu drugu IF…ELSE naredbu.
- Uz SELECT, CASE se može koristiti s drugim SQL klauzula poput UPDATE, ORDER BY.
Rezime
- U MS SQL-u postoje dvije vrste CASE-a: Simple CASE i Searched CASE
- ELSE je opcionalan u naredbi CASE.