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.

  1. Jednostavan SLUČAJ
  2. 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.

Rad s jednostavnom naredbom slučaja
Rad s jednostavnom naredbom slučaja

Primjeri

Pretpostavka: Pretpostavimo da imamo tablicu kao 'Guru99' s dva stupca i četiri retka kao što je prikazano u nastavku:

Jednostavan slučaj u SQL Serveru

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.

Jednostavan slučaj u SQL Serveru

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.

Jednostavan slučaj u SQL Serveru

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.

Rad izjave o pretraženom slučaju

Rad izjave o pretraženom slučaju

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.

Pretražen CASE primjer u SQL Serveru

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.

Tražili CASE u SQL Serveru

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

Nakon ključne riječi Case slijedi naredba WHEN, a između CASE i WHEN nema izraza.

npr:
SLUČAJ KADA ONDA Izjava_1…

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

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:
SLUČAJ
KADA ONDA Izjava_1…
KADA ONDA Izjava_2…

Simple Case podržava samo provjeru jednakosti. Odnosno je li CASE_Expression = VALUE_1, VALUE_2…

npr:
SLUČAJ WHEN Value_1 THEN Statement_1…U gornjem primjeru, jedina operacija koju izvodi sustav je provjera je li Case_Expression = Value_1

Uz Boolean_Expression_N, Search Case podržava svaku operaciju koja rezultira Booleovom vrijednošću. Uključuje operator jednako i nejednako.

npr:
SLUČAJ KADA THEN Izjava_1… U gornjem primjeru Boolean_Expression_1 može sadržavati i operator 'jednako' i 'nije jednako' kao što je A = B, A != B.

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 u SQL Serveru

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

Primjer ugniježđenog CASE-a u SQL Serveru

CASE s UPDATE

Pretpostavka: Pretpostavimo da imamo tablicu kao 'Guru99' s dva stupca i četiri retka kao što je prikazano u nastavku:

CASE s UPDATE u SQL Serveru

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'

CASE s UPDATE u SQL Serveru

Upitajmo tablicu Guru99 da provjerimo ažuriranu vrijednost:

CASE s UPDATE u SQL Serveru

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

CASE s Order by u SQL Serveru

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.