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.

  • 🧭 Uvjetna vrijednost: CASE izraz vraća vrijednost koja ovisi o tome koji WHEN uvjet se prvi evaluira kao istinit.
  • 1️⃣ Jednostavan SLUČAJ: Jednostavni CASE uspoređuje jedan izraz s popisom vrijednosti i pokreće provjeru jednakosti za svaki WHEN.
  • 🔎 Pretraženi SLUČAJ: Pretraživani CASE procjenjuje zaseban Booleov izraz za svaki WHEN, podržavajući raspone i operatore nejednakosti.
  • ➖ ELSE je opcionalno: Kada se ne podudaraju WHEN i ELSE je izostavljen, izraz CASE vraća NULL.
  • 🪆 Gniježđenje: Naredba CASE može se ugniježditi unutar druge naredbe CASE i unutar naredbe IF...ELSE za višerazinsku logiku.
  • 🔧 Iza SELECT-a: Osim SELECT-a, CASE radi s klauzulama UPDATE i ORDER BY za pokretanje uvjetnih ažuriranja i sortiranja.

CASE naredba i ugniježđeni CASE u SQL Serveru s T-SQL primjerima

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:

Dijagram toka koji prikazuje kako jednostavni CASE redom procjenjuje svaku WHEN vrijednost

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.

Uzorak Guru99 tablica sa stupcima Tutorial_ID i Tutorial_name i četiri retka

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.

Rezultat jednostavnog SLUČAJA bez ELSE-a, koji prikazuje Description za svaki naziv_tutoriala

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.

Rezultat jednostavnog CASE-a s ELSE-om, vraća zadani tekst za neusklađene retke

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:

Dijagram toka koji prikazuje kako pretraženi CASE redom evaluira svaki logički izraz

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.

Rezultat pretraženog CASE-a bez ELSE-a, koji odgovara svakom Tutorial_name-u Description

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.

Rezultat pretraženog CASE-a s ELSE-om, vraćajući zadani tekst za jezike koji nisu SQL

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:
SLUČAJ
WHEN Vrijednost_1 THEN Izjava_1…

Ključnu riječ CASE slijedi naredba WHEN, a između CASE i WHEN nema izraza.

npr:
SLUČAJ KADA ZATIM Izjava_1…

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:
SLUČAJ
WHEN Vrijednost_1 THEN Izjava_1…
WHEN Vrijednost_2 THEN Izjava_2…

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:
Studije slučaja
KADA ONDA Izjava_1…
KADA ONDA Izjava_2…

Jednostavan slučaj podržava samo provjeru jednakosti, tj. je li izraz_SLUČAJA = VRIJEDNOST_1, VRIJEDNOST_2…

npr:
SPIS KADA Vrijednost_1 ONDA Izjava_1…
U gornjem primjeru, jedina operacija koju sustav izvršava je provjera je li Izraz_Slučaja = Vrijednost_1.

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:
SLUČAJ KADA ZATIM Izjava_1…
U gornjem primjeru, Boolean_Expression_1 može sadržavati i operatore 'jednako' i 'nije jednako', kao što su A = B, A != B.

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:

Rezultat CASE-a ugniježđenog unutar IF…ELSE, ispisujući lokaciju posjeta za kartu

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:

Rezultat slučaja CASE ugniježđenog unutar drugog slučaja CASE, vraćajući Visit Europe za kartu od 250

CASE s UPDATE

Pretpostavimo ponovno da imamo 'GuruTablica od 99' s dva stupca i četiri retka, kao što je prikazano dolje:

Guru99 tablica prije ažuriranja slučaja, koja prikazuje izvorne vrijednosti Tutorial_Name

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:

Rezultat izvršavanja naredbe CASE UPDATE na Guru99 tablica

Postavimo pitanje o 'Guru99' tablica za provjeru ažuriranih vrijednosti:

Guru99 tablica nakon ažuriranja slučaja, koja prikazuje nove vrijednosti Tutorial_Name

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:

Rezultat ORDER BY s CASE izrazom koji sortira Guru99 tablica od Tutorial_ID

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.

Pitanja i odgovori

IIF() je skraćenica za CASE izraz s dva ishoda: vraća jednu vrijednost kada je uvjet istinit, a drugu kada je neistinit. Potpuni CASE izraz je fleksibilniji i može testirati mnogo WHEN uvjeta u jednoj naredbi.

Da. Budući da CASE vraća vrijednost, ona se može pojaviti u SELECT listi, WHERE klauzuli, HAVING klauzuli i GROUP BY. U WHERE klauzuli, CASE vam omogućuje primjenu različite logike filtriranja ovisno o drugim vrijednostima stupca.

Da. Postavljanje CASE izraza unutar SUM(), COUNT() ili AVG() izvodi uvjetnu agregaciju, zbrajajući ili brojeći samo retke koji odgovaraju svakom WHEN uvjetu. Ova se tehnika često koristi za izradu sažetih izvješća u pivot stilu.

COALESCE i ISNULL vraćaju samo prvu vrijednost s popisa koja nije NULL. CASE izraz je širi: on procjenjuje proizvoljne Booleove uvjete ili podudaranja vrijednosti i vraća rezultat prve grane koja je istinita.

Izraz CASE vraća jedan tip podataka. SQL Server ga određuje na temelju prioriteta tipa podataka svakog rezultata THEN i ELSE, pa bi sve grane trebale vraćati kompatibilne tipove kako bi se izbjegle pogreške u pretvorbi.

Da. Izraz CASE može se pojaviti u naredbi SELECT prikaza i bilo gdje unutar pohranjene procedure, funkcije ili okidača. Ista sintaksa izraza funkcionira na svim tim objektima.

Da. GitHub kopilot može izraditi jednostavne i pretraživane CASE izraze, uključujući ugniježđene CASE i CASE unutar UPDATE, iz prompta na prirodnom jeziku. Uvijek provjerite uvjete WHEN, redoslijed grananja i rukovanje ELSE prije pokretanja upita.

Umjetna inteligencija i pomoćnici strojnog učenja prevode pravila na običnom engleskom jeziku u jednostavne ili pretraživane CASE izraze, predlažu nedostajuće WHEN grane i označavaju preklapanjeping ili nedostižne uvjete. Programer pregledava svaki prijedlog radi ispravnosti prije implementacije.

Sažmite ovu objavu uz: