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: