Naredba CASE & ugniježđeni slučaj u SQL Serveru: primjer T-SQL-a
⚡ Pametni sažetak
CASE je uvjetni izraz u SQL Serveru koji vraća vrijednost na temelju prvog uvjeta koji se evaluira kao istinit, nudeći jednostavne i pretraživane oblike plus ugniježđivanje unutar IF...ELSE, UPDATE i ORDER BY.
Pregled slučaja u stvarnom životu!
Opet, u stvarnom životu izvodimo različite radnje ovisno o ishodu različitih uvjeta. Za daljnje objašnjenje, razmotrimo primjer u nastavku:
- Ako su karte za avion manje od 100 dolara, posjetit ću Los Angeles.
- Ako su avionske karte između 100 i 200 dolara, onda ću posjetiti New York.
- Ako cijene avionskih karata iznose između 200 i 400 dolara, onda ću posjetiti Europu.
- Inače, radije ću posjetiti obližnje turističko mjesto.
Razmotrimo kategorizaciju uvjeta i radnje odvojeno iz gornjeg primjera:
| Uvjeti – Avionske karte | Radnje se izvršavaju samo ako je uvjet ISTINA |
| 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 zasebnom radnjom. Na primjer, posjetitelj će izvršiti čin posjeta New Yorku samo pod uvjetom da je cijena avionske karte između 100 i 200 dolara. Slično tome, MS SQL CASE naredba također pruža mogućnost izvršavanja različitih T-SQL naredbi na temelju ishoda različitih uvjeta.
Što je naredba CASE u SQL Serveru?
Izjava CASE u SQL Server je produžetak AKO…INAČE naredbe. Za razliku od IF…ELSE, gdje je dopušten maksimalno samo jedan 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 je definirao korisnik.
Naučimo kako koristiti CASE u SQL i njegov koncept u sljedećim odjeljcima. U MS SQL-u postoje dvije vrste CASE-a:
- Jednostavan SLUČAJ
- Pretraženi CASE
Jednostavan SLUČAJ
Sintaksa za jednostavni 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 Izraz_slučaja označava izraz koji će se na kraju usporediti s Vrijednost_1, Vrijednost_2 i tako dalje.
- Parametri Izjava_1, Izjava_2… označavaju naredbe koje će se izvršiti ako je Izraz_slučaja = Vrijednost_1, Izraz_slučaja = Vrijednost_2 i tako dalje.
- Ukratko, uvjet je je li Izraz_slučaja = Vrijednost_N, a akcija je izvršavanje Izjave_N ako je gornji rezultat ISTINA.
- ALIAS_NAME je opcionalan i predstavlja alias naziv dodijeljen rezultatu SQL Server CASE naredbe. Uglavnom se koristi kada koristimo CASE u SQL Server SELECT klauzuli.
Pravila za jednostavni slučaj
- Jednostavni slučaj dopušta samo provjeru jednakosti Case_Expression s Value_1 na Value_N.
- Izraz_slučaja (Case_Expression) uspoređuje se s vrijednošću, redom, počevši od prve vrijednosti, tj. Vrijednost_1. U nastavku je prikazan pristup izvršavanja:
- Ako je Case_Expression ekvivalentan Value_1, daljnji WHEN…THEN iskazi se preskaču, a CASE će izvršenje odmah ZAVRŠITI.
- Ako se Izraz_slučaja ne podudara s Vrijednost_1, tada se Izraz_slučaja uspoređuje s Vrijednost_2 radi ekvivalencije. Ovaj proces usporedbe Izraz_slučaja s vrijednošću nastavlja se sve dok Izraz_slučaja ne pronađe odgovarajuću ekvivalentnu vrijednost iz skupa Vrijednost_1, Vrijednost_2 i tako dalje.
- Ako se ništa ne podudara, kontrola prelazi na naredbu ELSE i izvršava se naredba Statement_Else.
- ELSE nije obavezan.
- Ako ELSE nije prisutan i Case_Expression ne odgovara nijednoj od vrijednosti, tada se prikazuje NULL.
Donji dijagram ilustrira tijek izvršavanja jednostavnog slučaja:
Primjeri
Pretpostavimo da imamo tablicu pod nazivom 'Guru99' s dva stupca, Tutorial_ID i Tutorial_name, te četiri retka, kao što je prikazano dolje. Koristit ćemo ovo 'Guru99' tablica u primjerima koji slijede.
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: Dijagram u nastavku objašnjava tijek izvršavanja JEDNOSTAVNOG SLUČAJA BEZ DRUGOG.
Upit 2: JEDNOSTAVAN SLUČAJ 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: Dijagram u nastavku objašnjava tijek izvršavanja JEDNOSTAVNOG SLUČAJA 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 se procijeniti na TRUE ili FALSE.
- Parametri Izjava_1, Izjava_2… označavaju naredbe koje će se izvršiti ako je odgovarajući rezultat Boolean_Expression_1, Boolean_Expression_2 TRUE.
- Ukratko, uvjet je Booleov_izraz_1… a radnja je izvršavanje Izjave_N ako je gornji Booleov_izraz_1 ISTINA.
- ALIAS_NAME je opcionalan i predstavlja alias naziv dodijeljen rezultatu CASE naredbe. Uglavnom se koristi kada koristimo CASE u SELECT klauzuli.
Pravila za traženi slučaj
- Za razliku od jednostavnog slučaja, traženi slučaj nije ograničen samo na provjeru jednakosti, već dopušta i logički izraz.
- Booleov izraz se izračunava redom, počevši od prvog Booleovog izraza, tj. Booleov_Izraz_1. U nastavku je prikazan pristup izvršavanja:
- Ako je Boolean_Expression_1 TRUE, tada se daljnje WHEN…THEN naredbe preskaču, a izvršavanje CASE-a će odmah ZAVRŠITI.
- Ako je Booleov_izraz_1 NETOČAN, tada se Booleov_izraz_2 procjenjuje za uvjet ISTINA. Ovaj proces procjene Booleovog izraza nastavlja se sve dok jedan od Booleovih izraza ne vrati ISTINU.
- Ako se ništa ne podudara, kontrola prelazi na naredbu ELSE i izvršava se naredba Statement_Else.
- Kao i u jednostavnom slučaju, ELSE je opcionalan i u traženom slučaju.
- Ako ELSE nije prisutan i nijedan od Booleovih izraza ne vraća TRUE, tada se prikazuje NULL.
Donji dijagram ilustrira tijek izvršenja pretraženog slučaja:
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: Dijagram u nastavku objašnjava tijek izvršavanja PRETRAŽENOG SLUČAJA BEZ DRUGOG.
Upit 2: PRETRAŽENI SLUČAJ s opcijom 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
Rezultat: Dijagram u nastavku objašnjava tijek izvršavanja pretraživanog slučaja s ELSE.
Razlika između pristupa izvršenja: SIMPLE i SEARCH CASE
Pogledajmo primjer JEDNOSTAVNOG SLUČAJA u nastavku:
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 je 'Tutorial_name' dio CASE izraza u SQL-u. Zatim se vrijednost 'Tutorial_name' uspoređuje sa svakom WHEN vrijednošću, tj. 'SQL'... sve dok se 'Tutorial_name' ne podudara s WHEN vrijednošću.
Naprotiv, primjer SEARCH CASE nema izraz 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
Ovdje svaka WHEN naredba ima svoj vlastiti uvjetni Booleov izraz. Svaki Booleov izraz, tj. Tutorial_name = 'SQL'… se procjenjuje na TRUE/FALSE sve do prvog Booleovog izraza koji se procjenjuje na TRUE.
Razlika između jednostavnog i pretraživanog slučaja
| Jednostavan slučaj | Traženi slučaj |
| Ključnu riječ CASE odmah slijedi CASE_Expression, a nalazi se prije naredbe WHEN.
npr: |
Ključnu riječ CASE slijedi naredba WHEN, a između CASE i WHEN nema izraza.
npr: |
| U jednostavnom slučaju, za svaku WHEN naredbu postoji VRIJEDNOST. Te vrijednosti (Vrijednost_1, Vrijednost_2…) se sekvencijalno uspoređuju s jednim CASE_Expression. Rezultat se procjenjuje za uvjet TRUE/FALSE za svaku WHEN naredbu.
npr: |
U pretraživanom slučaju, za svaku WHEN naredbu postoji Booleov_izraz. Ovi Booleovi izrazi (Booleov_izraz_1, Booleov_izraz_2…) procjenjuju uvjet TRUE/FALSE za svaku WHEN naredbu.
npr: |
| Jednostavan slučaj podržava samo provjeru jednakosti, tj. je li izraz_SLUČAJA = VRIJEDNOST_1, VRIJEDNOST_2…
npr: |
S Boolean_Expression_N, pretraženi slučaj podržava bilo koju operaciju koja rezultira Booleovom vrijednošću. Uključuje operatore jednako i nije jednako.
npr: |
Ugniježđeni CASE: CASE u IF ELSE
Možemo koristiti CASE unutar IF...ELSE naredbe. Deklariramo varijabla za avionsku kartu i grananje na njezinu vrijednost. U nastavku 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 ugniježđen unutar IF…ELSE naredbe. Prvo se izvršava IF naredba, a ako je uvjet CASE u SQL Serveru False, tada se izvršava ELSE naredba. ELSE dio sadrži ugniježđenu CASE naredbu u SQL-u. Ovisno o vrijednosti avionske karte, prikazuje se jedan od sljedećih rezultata:
- Sustav ispisuje 'Posjetite obližnju turističku lokaciju' ako su avionske karte veće od 400 USD.
- Sustav ispisuje 'Visit Los Angeles' ako su avionske karte IZMEĐU 0 I 100 USD.
- Sustav ispisuje 'Visit New York' ako su avionske karte IZMEĐU 101 I 200 USD.
- Sustav ispisuje 'Visit Europe' ako su avionske karte IZMEĐU 201 I 400 USD.
Donji rezultat prikazuje lokaciju vraćenu kada se ugniježđeni CASE izvršava unutar grane ELSE:
Ugniježđeni CASE: CASE unutar CASE
Možemo koristiti CASE unutar drugog CASE-a u SQL-u. U nastavku 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 ugniježđen unutar druge CASE naredbe. Sustav prvo izvršava vanjski CASE; ako je Flight_Ticket < $400, izvršava se unutarnji CASE. Vraćena lokacija slijedi iste raspone karata kao i prethodni primjer, tako da karta od $250 spada u raspon od $201 do $400 i vraća 'Posjetite Europu'.
Rezultat u nastavku prikazuje lokaciju koju je vratio unutarnji CASE za kartu od 250 USD:
CASE s UPDATE
Pretpostavimo ponovno da imamo 'GuruTablica od 99' s dva stupca i četiri retka, kao što je prikazano dolje:
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 ažurira se vrijednošću naredbe THEN:
- Ako je Tutorial_Name = 'SQL', ažurirajte Tutorial_Name na 'Strukturirani jezik upita'.
- Ako je Naziv_tutoriala = 'PL/SQL', ažurirajte Naziv_tutoriala na 'Oracle PL/SQL'.
- Ako je Naziv_tutoriala = 'MSSQL', ažurirajte Naziv_tutoriala na 'Microsoft SQL'.
- Ako je Tutorial_Name = 'Hadoop', ažurirajte Tutorial_Name na 'Apache Hadoop'.
Izvršavanje naredbe ažurira odgovarajuće retke, kao što je prikazano u nastavku:
Postavimo pitanje o 'Guru99' tablica za provjeru ažuriranih vrijednosti:
CASE s Naručite po
Možemo koristiti CASE s ORDER BY. U nastavku 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, a kako se prvi WHEN Booleov izraz evaluira kao TRUE, Tutorial_ID je odabran za uvjet ORDER BY. Rezultat je prikazan u nastavku:
Zanimljivosti!
- Naredba CASE može biti ugniježđena u drugoj naredbi CASE, kao i u naredbi IF...ELSE.
- Osim SELECT-a, CASE se može koristiti i s drugim SQL klauzulama poput UPDATE i ORDER BY.














