CASE Statement & Nested Case i SQL Server: T-SQL Eksempel

โšก Smart oppsummering

CASE er et betinget uttrykk i SQL Server som returnerer en verdi basert pรฅ den fรธrste betingelsen som evalueres til sann, og tilbyr enkle og sรธkte former pluss nestet i IFโ€ฆELSE, UPDATE og ORDER BY.

  • ๐Ÿงญ Betinget verdi: Et CASE-uttrykk returnerer en verdi som avhenger av hvilken WHEN-betingelse som fรธrst evalueres som sann.
  • 1๏ธโƒฃ Enkelt CASE: Simple CASE sammenligner ett uttrykk mot en liste med verdier og kjรธrer en likhetssjekk for hvert WHEN.
  • ๐Ÿ”Ž Sรธkte CASE: Sรธkte CASE evaluerer et separat boolsk uttrykk for hver WHEN, stรธttende omrรฅder og ulikhetsoperatorer.
  • โž– ELLERS er valgfritt: Nรฅr ingen WHEN-treff og ELSE utelates, returnerer CASE-uttrykket NULL.
  • ๐Ÿช† Nesting: CASE kan nestes i et annet CASE og i en IFโ€ฆELSE-setning for flernivรฅlogikk.
  • ๐Ÿ”ง Utover SELECT: I tillegg til SELECT, fungerer CASE med UPDATE- og ORDER BY-klausuler for รฅ drive betingede oppdateringer og sortering.

CASE-setning og nestet CASE i SQL Server med T-SQL-eksempler

Oversikt over Case i det virkelige liv!

Igjen, i det virkelige liv utfรธrer vi forskjellige handlinger avhengig av utfallet av forskjellige forhold. For รฅ utdype dette ytterligere, se pรฅ eksemplet nedenfor:

  • Hvis flybillettene er mindre enn $100, vil jeg besรธke Los Angeles.
  • Hvis flybillettene koster mellom 100 og 200 dollar, sรฅ vil jeg besรธke New York.
  • Hvis flybillettene koster mellom 200 og 400 dollar, sรฅ vil jeg besรธke Europa.
  • Ellers foretrekker jeg รฅ besรธke et turistmรฅl i nรฆrheten.

La oss vurdere รฅ kategorisere tilstanden og handlingen separat fra eksemplet ovenfor:

Vilkรฅr โ€“ Flybilletter Handlinger utfรธrt, kun hvis betingelsen er SANN
Less enn $ 100 Besรธk Los Angeles
Mellom $ 100 til $ 200 Besรธk New York
Mellom $ 200 til $ 400 Besรธk Europa
Ingen av vilkรฅrene ovenfor oppfylte Nรฆrliggende turiststed

I eksemplet ovenfor kan vi se at utfallet av de ulike betingelsene styrer en separat handling. For eksempel vil den besรธkende kun utfรธre handlingen med รฅ besรธke New York under forutsetning av at flybilletten er mellom $100 og $200. Pรฅ samme mรฅte MS SQL CASE-setningen gir ogsรฅ muligheten til รฅ utfรธre forskjellige T-SQL-setninger basert pรฅ resultatet av forskjellige betingelser.

Hva er CASE Statement i SQL Server?

CASE-uttalelse i SQL Server er forlengelsen av HVISโ€ฆANNET setning. I motsetning til IFโ€ฆELSE, hvor maksimalt รฉn betingelse er tillatt, lar CASE brukeren bruke flere betingelser for รฅ utfรธre forskjellige sett med handlinger i MS SQL. Den returnerer en tilsvarende verdi knyttet til betingelsen definert av brukeren.

La oss lรฆre hvordan vi bruker CASE i SQL og konseptet i de fรธlgende avsnittene. I MS SQL finnes det to typer CASE:

  • Enkel CASE
  • Sรธkte i CASE

Enkel CASE

Syntaksen for enkel kasus

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]

Her:

  • Parameteren Case_Expression angir uttrykket som til slutt vil bli sammenlignet med Value_1, Value_2 og sรฅ videre.
  • Parametrene Statement_1, Statement_2โ€ฆ angir setningene som vil bli utfรธrt hvis Case_Expression = Value_1, Case_Expression = Value_2, og sรฅ videre.
  • Kort sagt er betingelsen om Case_Expression = Value_N, og handlingen er utfรธrelsen av Statement_N hvis resultatet ovenfor er TRUE.
  • ALIAS_NAME er valgfritt og er aliasnavnet som gis til resultatet av SQL Server CASE-setningen. Det brukes mest nรฅr vi bruker CASE i SQL Server SELECT-klausulen.

Regler for enkel sak

  • Simple Case tillater bare en likhetssjekk av Case_Expression med Value_1 til Value_N.
  • Case_Expression sammenlignes med en verdi, i rekkefรธlge, startende fra den fรธrste verdien, dvs. Value_1. Nedenfor er utfรธrelsesmetoden:
  • Hvis Case_Expression er ekvivalent med Value_1, hoppes ytterligere WHEN...THEN-setninger over, og CASE-kjรธringen AVSLUTERES umiddelbart.
  • Hvis Case_Expression ikke samsvarer med Verdi_1, sammenlignes Case_Expression med Verdi_2 for ekvivalens. Denne prosessen med รฅ sammenligne Case_Expression med en verdi fortsetter til Case_Expression finner en samsvarende ekvivalent verdi fra settet med Verdi_1, Verdi_2 og sรฅ videre.
  • Hvis ingenting samsvarer, gรฅr kontrollen til ELSE-setningen, og Statement_Else kjรธres.
  • ANDET er valgfritt.
  • Hvis ELSE ikke finnes og Case_Expression ikke samsvarer med noen av verdiene, vises NULL.

Diagrammet nedenfor illustrerer utfรธrelsesflyten for et enkelt tilfelle:

Flytskjema som viser hvordan et enkelt CASE evaluerer hver WHEN-verdi i rekkefรธlge

Eksempler

Anta at vi har en tabell som heter 'Guru99' med to kolonner, Tutorial_ID og Tutorial_name, og fire rader, som vist nedenfor. Vi vil bruke denne 'Guru99'-tabellen i eksemplene som fรธlger.

Eksempel Guru99 tabeller med kolonnene Tutorial_ID og Tutorial_name og fire rader

Spรธrsmรฅl 1: ENKEL CASE med NO ELSE-alternativet

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

Resultat: Diagrammet nedenfor forklarer utfรธrelsesflyten for et SIMPLE CASE uten NO ELSE.

Resultat av et enkelt CASE uten noe annet, som viser en Description for hvert Tutorial_name

Spรธrsmรฅl 2: SIMPLE CASE med ELSE-alternativet

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

Resultat: Diagrammet nedenfor forklarer utfรธrelsesflyten for et SIMPLE CASE med ELSE.

Resultat av et enkelt CASE med ELSE, som returnerer standardteksten for rader som ikke samsvarer

Sรธkte i CASE

Syntaksen for sรธkt stor- eller liten-sak

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]

Her:

  • Parameteren Boolean_Expression_1โ€ฆ angir uttrykket som skal evalueres for SANN eller USANN.
  • Parametrene Statement_1, Statement_2โ€ฆ angir setningene som vil utfรธres hvis det tilsvarende resultatet av Boolean_Expression_1 eller Boolean_Expression_2 er SANN.
  • Kort sagt er betingelsen Boolsk_Uttrykk_1โ€ฆ og handlingen er utfรธrelsen av Statement_N hvis det ovennevnte Boolsk_Uttrykk_1 er SANN.
  • ALIAS_NAME er valgfritt og er aliasnavnet som gis til resultatet av CASE-setningen. Det brukes mest nรฅr vi bruker CASE i SELECT-klausulen.

Regler for sรธkt sak

  • I motsetning til det enkle tilfellet er ikke det sรธkte tilfellet begrenset til bare en likhetssjekk, men tillater et boolsk uttrykk.
  • Det boolske uttrykket evalueres i rekkefรธlge, startende fra det fรธrste boolske uttrykket, dvs. Boolsk_Uttrykk_1. Nedenfor er utfรธrelsesmetoden:
  • Hvis Boolean_Expression_1 er TRUE, hoppes det over ytterligere WHENโ€ฆTHEN-setninger, og CASE-kjรธringen END umiddelbart.
  • Hvis Boolsk_Uttrykk_1 er USANN, evalueres Boolsk_Uttrykk_2 for en SANN-betingelse. Denne prosessen med รฅ vurdere det boolske uttrykket fortsetter til et av de boolske uttrykkene returnerer SANN.
  • Hvis ingenting samsvarer, gรฅr kontrollen til ELSE-setningen, og Statement_Else kjรธres.
  • I likhet med enkelt tilfelle er ELSE ogsรฅ valgfritt i sรธkt tilfelle.
  • Hvis ELSE ikke finnes, og ingen av de boolske uttrykkene returnerer TRUE, vises NULL.

Diagrammet nedenfor illustrerer utfรธrelsesflyten for den sรธkte saken:

Flytskjema som viser hvordan et sรธkt CASE evaluerer hvert boolsk uttrykk i rekkefรธlge

Eksempler

Spรธrsmรฅl 1: Sร˜KT SAKS med alternativet 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

Resultat: Diagrammet nedenfor forklarer utfรธrelsesflyten for den Sร˜KTE SAKEN uten NOEN ANNET.

Resultat av et sรธkt CASE uten ELSE, som matcher hvert Tutorial_name med et Description

Spรธrsmรฅl 2: Sร˜KT SAK med ELLERS-alternativet

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

Resultat: Diagrammet nedenfor forklarer utfรธrelsesflyten for Sร˜KTE SAKE med ELSE.

Resultat av et sรธkt CASE med ELSE, som returnerer standardteksten for ikke-SQL-sprรฅk

Forskjellen mellom utfรธrelsesmetoden: SIMPLE og SEARCH CASE

La oss se pรฅ eksemplet med det ENKELT TILfellet nedenfor:

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

Her er ยซTutorial_nameยป en del av CASE-uttrykket i SQL. Deretter sammenlignes verdien ยซTutorial_nameยป med hver WHEN-verdi, dvs. ยซSQLยป ... inntil ยซTutorial_nameยป samsvarer med en WHEN-verdi.

Tvert imot har SEARCH CASE-eksemplet ikke noe CASE-uttrykk:

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

Her har hver WHEN-setning sitt eget betingede boolske uttrykk. Hvert boolske uttrykk, dvs. Tutorial_name = 'SQL'โ€ฆ evalueres for TRUE/FALSE inntil det fรธrste boolske uttrykket som evalueres til TRUE.

Forskjellen mellom enkel og sรธkt sak

Enkel sak Sรธkte i Case
CASE-nรธkkelordet etterfรธlges umiddelbart av CASE_Expression og kommer fรธr WHEN-setningen.

Eg:
SAK
Nร…R Verdi_1 DA Utsagn_1...

CASE-nรธkkelordet etterfรธlges av WHEN-setningen, og det er ikke noe uttrykk mellom CASE og WHEN.

Eg:
TILFELLET Nร…R Sร… Uttalelse_1โ€ฆ

I et enkelt tilfelle finnes det en VALUE for hver WHEN-setning. Disse verdiene (Verdi_1, Verdi_2โ€ฆ) sammenlignes sekvensielt med et enkelt CASE_Expression. Resultatet evalueres for TRUE/FALSE-betingelsen for hver WHEN-setning.

Eg:
SAK
Nร…R Verdi_1 DA Utsagn_1...
Nร…R Verdi_2 DA Utsagn_2...

I et sรธkt tilfelle finnes det et boolsk_uttrykk for hver WHEN-setning. Disse boolske uttrykkene (boolsk_uttrykk_1, boolsk_uttrykk_2โ€ฆ) evaluerer TRUE/FALSE-betingelsen for hver WHEN-setning.

Eg:
CASE
Nร…R Sร… Statement_1...
Nร…R Sร… Statement_2...

Et enkelt tilfelle stรธtter bare en likhetssjekk, dvs. om CASE_Expression = VALUE_1, VALUE_2โ€ฆ

Eg:
SAK Nร…R Verdi_1 Sร… Uttalelse_1โ€ฆ
I eksemplet ovenfor er den eneste operasjonen som utfรธres av systemet รฅ sjekke om Case_Expression = Value_1.

Med Boolean_Expression_N stรธtter et sรธkt tilfelle enhver operasjon som resulterer i en boolsk verdi. Den inkluderer operatorene ยซlikยป og ยซikke likยป.

Eg:
TILFELLET Nร…R Sร… Uttalelse_1โ€ฆ
I eksemplet ovenfor kan Boolean_Expression_1 inneholde bรฅde operatorene 'lik med' og 'ikke lik med', som A = B, A != B.

Nestet CASE: CASE i IF ELSE

Vi kan bruke CASE i en IFโ€ฆELSE-setning. Vi deklarerer en variabel for flybilletten og filialen basert pรฅ verdien. Nedenfor er et eksempel pรฅ MS-SQL-kode:

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

I eksemplet ovenfor er CASE nestet i IFโ€ฆELSE-setningen. Fรธrst utfรธres IF-setningen, og hvis CASE-betingelsen i SQL Server er usann, utfรธres ELSE-setningen. ELSE-delen inneholder en nestet CASE-setning i SQL. Avhengig av flybillettens verdi vises ett av fรธlgende resultater:

  • Systemet skriver ut ยซBesรธk turistdestinasjon i nรฆrhetenยป hvis flybillettene er over $400.
  • Systemet skriver ut ยซBesรธk Los Angelesยป hvis flybillettene er MELLOM $0 OG $100.
  • Systemet skriver ut ยซBesรธk New Yorkยป hvis flybillettene er MELLOM $101 OG $200.
  • Systemet skriver ut ยซBesรธk Europaยป hvis flybillettene er MELLOM $201 OG $400.

Resultatet nedenfor viser plasseringen som returneres nรฅr den nestede CASE kjรธrer inne i ELSE-grenen:

Resultat av et CASE nestet i en IFโ€ฆELSE, som skriver ut besรธksstedet for billetten

Nestet CASE: CASE inni CASE

Vi kan bruke CASE inni et annet CASE i SQL. Nedenfor er et eksempel pรฅ MS-SQL-kode:

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

I eksemplet ovenfor er CASE nestet i en annen CASE-setning. Systemet utfรธrer den ytre CASE-setningen fรธrst; hvis Flight_Ticket < $400, kjรธres den indre CASE-setningen. Den returnerte plasseringen fรธlger de samme billettomrรฅdene som forrige eksempel, sรฅ en billett pรฅ $250 faller i omrรฅdet $201โ€“$400 og returnerer 'Visit Europe'.

Resultatet nedenfor viser plasseringen som returneres av det indre CASE-et for en billett pรฅ 250 dollar:

Resultat av en CASE nestet inni en annen CASE, som returnerer Visit Europe for en billett pรฅ 250

CASE med OPPDATERING

Anta igjen at vi har 'Guru99' tabell med to kolonner og fire rader, som vist nedenfor:

Guru99-tabellen fรธr CASE UPDATE, som viser de opprinnelige verdiene for Tutorial_Name

Vi kan bruke CASE med UPDATE. Nedenfor er eksempelet pรฅ MS-SQL-koden:

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
	)

I eksemplet ovenfor brukes CASE i UPDATE-setningen. Avhengig av verdien i Tutorial_Name oppdateres kolonnen Tutorial_Name med verdien i THEN-setningen:

  • Hvis Tutorial_Name = 'SQL', oppdater Tutorial_Name til 'Structured Query language'.
  • Hvis Tutorial_Name = 'PL/SQL', oppdater deretter Tutorial_Name til 'Oracle PL/SQL'.
  • Hvis Tutorial_Name = 'MSSQL', oppdater deretter Tutorial_Name til 'Microsoft SQL'.
  • Hvis Tutorial_Name = 'Hadoop', oppdater Tutorial_Name til 'Apache Hadoop'.

Nรฅr setningen kjรธres, oppdateres de samsvarende radene, som vist nedenfor:

Utfรธrelsesresultat av CASE UPDATE-setningen pรฅ Guru99-tabell

La oss spรธrre etter 'Guru99'-tabellen for รฅ sjekke de oppdaterte verdiene:

Guru99-tabellen etter CASE UPDATE, som viser de nye verdiene for Tutorial_Name

CASE med Bestill etter

Vi kan bruke CASE med ORDER BY. Nedenfor er et eksempel pรฅ MS-SQL-kode:

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

Her brukes CASE med ORDER BY. @Order settes til 1, og siden det fรธrste boolske WHEN-uttrykket evalueres til TRUE, velges Tutorial_ID for ORDER BY-betingelsen. Resultatet vises nedenfor:

Resultat av ORDER BY med et CASE-uttrykk som sorterer Guru99 tabell av Tutorial_ID

Interessante fakta!

  • CASE kan nestes i en annen CASE sรฅ vel som i en IFโ€ฆELSE-setning.
  • I tillegg til SELECT kan CASE brukes med andre SQL-klausuler som UPDATE og ORDER BY.

Spรธrsmรฅl og svar

IIF() er en forkortelse for et CASE-uttrykk med to utfall: det returnerer รฉn verdi nรฅr betingelsen er sann og en annen nรฅr den er usann. Et fullstendig CASE-uttrykk er mer fleksibelt og kan teste mange WHEN-betingelser i รฉn setning.

Ja. Fordi CASE returnerer en verdi, kan den vises i en SELECT-liste, en WHERE-klausul, en HAVING-klausul og GROUP BY. I en WHERE-klausul lar CASE deg bruke ulik filterlogikk avhengig av andre kolonneverdier.

Ja. Plassere et CASE-uttrykk i SUM(), COUNT() eller AVG() utfรธrer betinget aggregering, og summerer eller teller bare radene som samsvarer med hver WHEN-betingelse. Denne teknikken brukes ofte til รฅ bygge sammendragsrapporter i pivotstil.

COALESCE og ISNULL returnerer bare den fรธrste verdien som ikke er NULL fra en liste. Et CASE-uttrykk er bredere: det evaluerer vilkรฅrlige boolske betingelser eller verditreff og returnerer resultatet av den fรธrste grenen som er sann.

Et CASE-uttrykk returnerer รฉn enkelt datatype. SQL Server bestemmer den fra datatypeprioriteten til hvert THEN- og ELSE-resultat, sรฅ alle grener bรธr returnere kompatible typer for รฅ unngรฅ konverteringsfeil.

Ja. Et CASE-uttrykk kan vises i SELECT-setningen i en visning og hvor som helst i en lagret prosedyre, funksjon eller trigger. Den samme uttrykkssyntaksen fungerer pรฅ tvers av alle disse objektene.

Ja. GitHub Copilot kan utarbeide enkle og sรธkte CASE-uttrykk, inkludert nestede CASE og CASE i UPDATE, fra en ledetekst i naturlig sprรฅk. Se alltid gjennom WHEN-betingelsene, forgreningsrekkefรธlgen og ELSE-hรฅndteringen fรธr du kjรธrer spรธrringen.

AI- og maskinlรฆringsassistenter oversetter regler pรฅ vanlig engelsk til enkle eller sรธkte CASE-uttrykk, foreslรฅr manglende WHEN-grener og flagger overlappingping eller uoppnรฅelige forhold. Utvikleren gjennomgรฅr hvert forslag for รฅ sikre at det er korrekt fรธr det distribueres.

Oppsummer dette innlegget med: