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

โšก Smart opsummering

CASE er et betinget udtryk i SQL Server, der returnerer en vรฆrdi baseret pรฅ den fรธrste betingelse, der evalueres til sand, og som tilbyder simple og sรธgte formularer samt indlejring i IFโ€ฆELSE, UPDATE og ORDER BY.

  • ๐Ÿงญ Betinget vรฆrdi: Et CASE-udtryk returnerer en vรฆrdi, der afhรฆnger af, hvilken WHEN-betingelse der fรธrst evalueres som sand.
  • 1๏ธโƒฃ Simpelt CASE: Simple CASE sammenligner รฉt udtryk med en liste af vรฆrdier og kรธrer en lighedskontrol for hvert WHEN.
  • ๐Ÿ”Ž Sรธgte CASE: Den sรธgte CASE evaluerer et separat boolsk udtryk for hver WHEN, understรธttende intervaller og ulighedsoperatorer.
  • โž– ELLERS er valgfrit: Nรฅr ingen WHEN matcher, og ELSE udelades, returnerer CASE-udtrykket NULL.
  • ๐Ÿช† Indlejring: CASE kan indlejres i en anden CASE og i en IFโ€ฆELSE-sรฆtning for flerniveaulogik.
  • ๐Ÿ”ง Ud over SELECT: Udover SELECT arbejder CASE med UPDATE- og ORDER BY-klausuler for at drive betingede opdateringer og sortering.

CASE-sรฆtning og indlejret CASE i SQL Server med T-SQL-eksempler

Oversigt over Case i det virkelige liv!

Igen udfรธrer vi i virkeligheden forskellige handlinger afhรฆngigt af resultatet af forskellige forhold. For at uddybe dette yderligere kan vi se eksemplet nedenfor:

  • Hvis flybilletter er mindre end $100, sรฅ vil jeg besรธge Los Angeles.
  • Hvis flybilletter koster mellem $100 og $200, sรฅ vil jeg besรธge New York.
  • Hvis flybilletter koster mellem $200 og $400, sรฅ vil jeg besรธge Europa.
  • Ellers foretrรฆkker jeg at besรธge et turistmรฅl i nรฆrheden.

Lad os overveje at kategorisere tilstanden og handlingen separat fra ovenstรฅende eksempel:

Betingelser โ€“ Flybilletter Handlinger udfรธrt, kun hvis betingelsen er SAND
Less end $ 100 Besรธg Los Angeles
Mellem $ 100 til $ 200 Besรธg New York
Mellem $ 200 til $ 400 Besรธg Europa
Ingen af โ€‹โ€‹ovenstรฅende betingelser opfyldt Nรฆrliggende turiststed

I ovenstรฅende eksempel kan vi se, at resultatet af de forskellige betingelser styrer en separat handling. For eksempel vil den besรธgende kun udfรธre handlingen at besรธge New York pรฅ betingelse af, at flybilletten koster mellem $100 og $200. Tilsvarende gรฆlder det, at MSSQL CASE-sรฆtningen giver ogsรฅ mulighed for at udfรธre forskellige T-SQL-sรฆtninger baseret pรฅ resultatet af forskellige betingelser.

Hvad er CASE Statement i SQL Server?

CASE-erklรฆring i SQL Server er forlรฆngelsen af HVIS ELLERS sรฆtning. I modsรฆtning til IFโ€ฆELSE, hvor maksimalt รฉn betingelse er tilladt, tillader CASE brugeren at anvende flere betingelser for at udfรธre forskellige sรฆt handlinger i MS SQL. Den returnerer en tilsvarende vรฆrdi, der er knyttet til den betingelse, som brugeren har defineret.

Lad os lรฆre at bruge CASE i SQL og dets koncept i de fรธlgende afsnit. I MS SQL er der to typer CASE:

  • Simpel CASE
  • Sรธgte CASE

Simpel CASE

Syntaksen for simpelt tilfรฆlde

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 angiver det udtryk, der i sidste ende vil blive sammenlignet med Value_1, Value_2 osv.
  • Parametrene Statement_1, Statement_2โ€ฆ angiver de sรฆtninger, der vil blive udfรธrt, hvis Case_Expression = Value_1, Case_Expression = Value_2 osv.
  • Kort sagt er betingelsen, om Case_Expression = Value_N, og handlingen er udfรธrelsen af โ€‹โ€‹Statement_N, hvis ovenstรฅende resultat er SAND.
  • ALIAS_NAME er valgfrit og er aliasnavnet, der gives til resultatet af SQL Server CASE-sรฆtningen. Det bruges mest, nรฅr vi bruger CASE i SQL Server SELECT-klausulen.

Regler for Simple Case

  • Simple Case tillader kun en lighedskontrol af Case_Expression med Value_1 til Value_N.
  • Case_Expression sammenlignes med en vรฆrdi i rรฆkkefรธlge, startende fra den fรธrste vรฆrdi, dvs. Value_1. Nedenfor er udfรธrelsesmetoden:
  • Hvis Case_Expression er รฆkvivalent med Value_1, sรฅ springes yderligere WHEN...THEN-sรฆtninger over, og CASE-eksekveringen SLUTTER med det samme.
  • Hvis Case_Expression ikke matcher Value_1, sammenlignes Case_Expression med Value_2 for รฆkvivalens. Denne proces med at sammenligne Case_Expression med en vรฆrdi fortsรฆtter, indtil Case_Expression finder en matchende รฆkvivalent vรฆrdi fra sรฆttet Value_1, Value_2 osv.
  • Hvis intet matcher, gรฅr kontrollen til ELSE-sรฆtningen, og Statement_Else udfรธres.
  • ANDET er valgfrit.
  • Hvis ELSE ikke er til stede, og Case_Expression ikke matcher nogen af โ€‹โ€‹vรฆrdierne, vises NULL.

Diagrammet nedenfor illustrerer udfรธrelsesflowet for en simpel case:

Flowchart, der viser, hvordan et simpelt CASE evaluerer hver WHEN-vรฆrdi i rรฆkkefรธlge

Eksempler

Antag at vi har en tabel med navnet 'Guru99' med to kolonner, Tutorial_ID og Tutorial_name, og fire rรฆkker, som vist nedenfor. Vi vil bruge denne 'Guru99'-tabellen i de fรธlgende eksempler.

Prรธve Guru99 tabel med kolonnerne Tutorial_ID og Tutorial_name og fire rรฆkker

Forespรธrgsel 1: ENKEL TILFร†LDE med indstillingen INGEN ANDET

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 udfรธrelsesflowet for en SIMPLE CASE uden ANDET.

Resultat af et simpelt CASE uden andet, der viser en Description for hvert Tutorial_name

Forespรธrgsel 2: SIMPLE CASE med ELSE-indstillingen

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 udfรธrelsesflowet for en SIMPLE CASE med ELSE.

Resultat af et simpelt CASE med ELSE, der returnerer standardteksten for uoverensstemmende rรฆkker

Sรธgte CASE

Syntaksen for sรธgte store/smรฅ tilfรฆlde

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โ€ฆ angiver det udtryk, der skal evalueres for SAND eller FALSK.
  • Parametrene Statement_1, Statement_2โ€ฆ angiver de sรฆtninger, der udfรธres, hvis det tilsvarende resultat af Boolean_Expression_1 eller Boolean_Expression_2 er SANDT.
  • Kort sagt er betingelsen Boolean_Expression_1โ€ฆ og handlingen er udfรธrelsen af โ€‹โ€‹Statement_N, hvis ovenstรฅende Boolean_Expression_1 er SAND.
  • ALIAS_NAME er valgfrit og er aliasnavnet, der gives til resultatet af CASE-sรฆtningen. Det bruges mest, nรฅr vi bruger CASE i SELECT-klausulen.

Regler for sรธgt sag

  • I modsรฆtning til det simple tilfรฆlde er det sรธgte tilfรฆlde ikke begrรฆnset til kun en lighedskontrol, men tillader et boolsk udtryk.
  • Det boolske udtryk evalueres i rรฆkkefรธlge startende fra det fรธrste boolske udtryk, dvs. Boolean_Expression_1. Nedenfor er udfรธrelsesmetoden:
  • Hvis Boolean_Expression_1 er TRUE, springes yderligere WHENโ€ฆTHEN-sรฆtninger over, og CASE-udfรธrelsen END med det samme.
  • Hvis Boolean_Expression_1 er FALSK, evalueres Boolean_Expression_2 for en TRUE-betingelse. Denne proces med at vurdere det boolske udtryk fortsรฆtter, indtil et af de boolske udtryk returnerer TRUE.
  • Hvis intet matcher, gรฅr kontrollen til ELSE-sรฆtningen, og Statement_Else udfรธres.
  • Ligesom i det simple tilfรฆlde er ELSE ogsรฅ valgfri i det sรธgte tilfรฆlde.
  • Hvis ELSE ikke er til stede, og ingen af โ€‹โ€‹de boolske udtryk returnerer TRUE, vises NULL.

Diagrammet nedenfor illustrerer udfรธrelsesflowet for den sรธgte sag:

Flowchart, der viser, hvordan et sรธgt CASE evaluerer hvert boolsk udtryk i rรฆkkefรธlge

Eksempler

Forespรธrgsel 1: Sร˜GNET CASE med INGEN ANDET-indstilling

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 udfรธrelsesflowet for den Sร˜GTE SAG uden ANDET.

Resultat af en sรธgt CASE uden ELSE, der matcher hvert Tutorial_name med en Description

Forespรธrgsel 2: Sร˜GT SAG med ELLERS-muligheden

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 udfรธrelsesflowet for Sร˜GTEDE SAG med ELSE.

Resultat af en sรธgt CASE med ELSE, der returnerer standardteksten for ikke-SQL-sprog

Forskellen mellem udfรธrelsesmetoden: SIMPLE og SEARCH CASE

Lad os se pรฅ eksemplet med det SIMPLE CAS-nummer 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 af CASE-udtrykket i SQL. Derefter sammenlignes vรฆrdien 'Tutorial_name' med hver WHEN-vรฆrdi, dvs. 'SQL' ... indtil 'Tutorial_name' matcher en WHEN-vรฆrdi.

Derimod har SEARCH CASE-eksemplet intet CASE-udtryk:

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-sรฆtning sit eget betingede boolske udtryk. Hvert boolsk udtryk, dvs. Tutorial_name = 'SQL'โ€ฆ evalueres for TRUE/FALSE indtil det fรธrste boolske udtryk, der evalueres til TRUE.

Forskellen mellem simpel og sรธgt sag

Enkel sag Sรธgte Case
CASE-nรธgleordet efterfรธlges umiddelbart af CASE_Expression og kommer fรธr WHEN-sรฆtningen.

F.eks:
SAG
Nร…R Vรฆrdi_1 Sร… Udsagn_1...

CASE-nรธgleordet efterfรธlges af WHEN-sรฆtningen, og der er intet udtryk mellem CASE og WHEN.

F.eks:
TILFร†LDE HVOR Sร… Udsagn_1โ€ฆ

I et simpelt tilfรฆlde findes der en VALUE for hver WHEN-sรฆtning. Disse vรฆrdier (Vรฆrdi_1, Vรฆrdi_2โ€ฆ) sammenlignes sekventielt med et enkelt CASE_Expression. Resultatet evalueres for TRUE/FALSE-betingelsen for hver WHEN-sรฆtning.

F.eks:
SAG
Nร…R Vรฆrdi_1 Sร… Udsagn_1...
Nร…R Vรฆrdi_2 Sร… Udsagn_2...

I et sรธgt tilfรฆlde findes der et Boolean_Expression for hver WHEN-sรฆtning. Disse boolske udtryk (Boolean_Expression_1, Boolean_Expression_2โ€ฆ) evaluerer TRUE/FALSE-betingelsen for hver WHEN-sรฆtning.

F.eks:
CASE
HVORNร…R Sร… Statement_1...
HVORNร…R Sร… Statement_2...

Et simpelt tilfรฆlde understรธtter kun en lighedskontrol, dvs. om CASE_Expression = VALUE_1, VALUE_2โ€ฆ

F.eks:
CASE Nร…R Vรฆrdi_1 Sร… Udsagn_1โ€ฆ
I ovenstรฅende eksempel er den eneste handling, der udfรธres af systemet, at kontrollere, om Case_Expression = Value_1.

Med Boolean_Expression_N understรธtter et Searched Case enhver operation, der resulterer i en boolsk vรฆrdi. Det inkluderer operatorerne 'lig med' og 'ikke-lig med'.

F.eks:
TILFร†LDE HVOR Sร… Udsagn_1โ€ฆ
I ovenstรฅende eksempel kan Boolean_Expression_1 indeholde bรฅde operatorerne 'lig med' og 'ikke lig med', f.eks. A = B, A != B.

Indlejret CASE: CASE i HVIS ANDET

Vi kan bruge CASE i en IFโ€ฆELSE-sรฆtning. Vi erklรฆrer en variabel for flybilletten og filialen baseret pรฅ dens vรฆrdi. Nedenfor er eksemplet 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 ovenstรฅende eksempel er CASE indlejret i IFโ€ฆELSE-sรฆtningen. Fรธrst udfรธres IF-sรฆtningen, og hvis CASE-betingelsen i SQL Server er Falsk, udfรธres ELSE-sรฆtningen. ELSE-delen indeholder en indlejret CASE-sรฆtning i SQL. Afhรฆngigt af flybillettens vรฆrdi vises et af fรธlgende resultater:

  • Systemet udskriver 'Besรธg turistdestination i nรฆrheden', hvis flybilletterne er over $400.
  • Systemet udskriver 'Besรธg Los Angeles', hvis flybilletterne er MELLEM $0 OG $100.
  • Systemet udskriver 'Besรธg New York', hvis flybilletterne er MELLEM $101 OG $200.
  • Systemet udskriver 'Besรธg Europa', hvis flybilletterne er MELLEM $201 OG $400.

Resultatet nedenfor viser den placering, der returneres, nรฅr den indbyggede CASE kรธrer inde i ELSE-grenen:

Resultat af et CASE indlejret i en IFโ€ฆELSE, der udskriver besรธgsstedet for billetten

Indlejret CASE: CASE inde i CASE

Vi kan bruge CASE i et andet 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 ovenstรฅende eksempel er CASE indlejret i en anden CASE-sรฆtning. Systemet udfรธrer den ydre CASE fรธrst; hvis Flight_Ticket < $400, kรธres den indre CASE. Den returnerede placering fรธlger de samme billetintervaller som det forrige eksempel, sรฅ en billet til $250 falder i intervallet $201-$400 og returnerer 'Visit Europe'.

Resultatet nedenfor viser den placering, der returneres af det indre CASE for en billet pรฅ $250:

Resultat af en CASE indlejret i en anden CASE, der returnerer Visit Europe for en billet pรฅ 250

CASE med OPDATERING

Antag igen, at vi har 'Guru99' tabel med to kolonner og fire rรฆkker, som vist nedenfor:

Guru99-tabel fรธr CASE UPDATE, der viser de oprindelige Tutorial_Name-vรฆrdier

Vi kan bruge CASE med UPDATE. Nedenfor er eksemplet 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 ovenstรฅende eksempel bruges CASE i UPDATE-sรฆtningen. Afhรฆngigt af vรฆrdien i Tutorial_Name opdateres kolonnen Tutorial_Name med vรฆrdien i THEN-sรฆtningen:

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

Kรธrsel af sรฆtningen opdaterer de matchende rรฆkker, som vist nedenfor:

Udfรธrelsesresultat af CASE UPDATE-sรฆtningen pรฅ Guru99 bord

Lad os spรธrge 'Guru99'-tabel for at kontrollere de opdaterede vรฆrdier:

Guru99-tabel efter CASE UPDATE, der viser de nye Tutorial_Name-vรฆrdier

CASE med Bestil efter

Vi kan bruge 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 bruges CASE med ORDER BY. @Order sรฆttes til 1, og da det fรธrste WHEN boolske udtryk evalueres til TRUE, vรฆlges Tutorial_ID for ORDER BY-betingelsen. Resultatet er vist nedenfor:

Resultat af ORDER BY med et CASE-udtryk, der sorterer Guru99 tabel af Tutorial_ID

Interessante fakta!

  • CASE kan indlejres i en anden CASE sรฅvel som i en IFโ€ฆELSE-sรฆtning.
  • Ud over SELECT kan CASE bruges sammen med andre SQL-klausuler som UPDATE og ORDER BY.

Ofte Stillede Spรธrgsmรฅl

IIF() er en forkortelse for et CASE-udtryk med to udfald: det returnerer รฉn vรฆrdi, nรฅr betingelsen er sand, og en anden, nรฅr den er falsk. Et fuldt CASE-udtryk er mere fleksibelt og kan teste mange WHEN-betingelser i รฉn sรฆtning.

Ja. Fordi CASE returnerer en vรฆrdi, kan den vises i en SELECT-liste, en WHERE-klausul, en HAVING-klausul og GROUP BY. I en WHERE-klausul giver CASE dig mulighed for at anvende forskellig filterlogik afhรฆngigt af andre kolonnevรฆrdier.

Ja. Placering af et CASE-udtryk i SUM(), COUNT() eller AVG() udfรธrer betinget aggregering, hvor kun de rรฆkker, der matcher hver WHEN-betingelse, summeres eller tรฆlles. Denne teknik bruges ofte til at opbygge pivot-lignende oversigtsrapporter.

COALESCE og ISNULL returnerer kun den fรธrste ikke-NULL-vรฆrdi fra en liste. Et CASE-udtryk er bredere: det evaluerer vilkรฅrlige boolske betingelser eller vรฆrdimatchninger og returnerer resultatet af den fรธrste gren, der er sand.

Et CASE-udtryk returnerer en enkelt datatype. SQL Server bestemmer den ud fra datatypeprรฆferencen for hvert THEN- og ELSE-resultat, sรฅ alle grene skal returnere kompatible typer for at undgรฅ konverteringsfejl.

Ja. Et CASE-udtryk kan forekomme i SELECT-sรฆtningen i en visning og hvor som helst i en lagret procedure, funktion eller trigger. Den samme udtrykssyntaks fungerer pรฅ tvรฆrs af alle disse objekter.

Ja. GitHub Copilot kan udarbejde simple og sรธgte CASE-udtryk, inklusive indlejrede CASE og CASE i UPDATE, fra en prompt i naturligt sprog. Gennemgรฅ altid WHEN-betingelserne, forgreningsrรฆkkefรธlgen og ELSE-hรฅndteringen, fรธr forespรธrgslen kรธres.

AI- og maskinlรฆringsassistenter oversรฆtter regler pรฅ almindeligt engelsk til simple eller sรธgte CASE-udtryk, foreslรฅr manglende WHEN-grene og markerer overlap.ping eller uopnรฅelige betingelser. Udvikleren gennemgรฅr hvert forslag for korrekthed, fรธr det implementeres.

Opsummer dette indlรฆg med: