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.

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:
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.
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.
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.
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:
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.
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.
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: |
CASE-nรธgleordet efterfรธlges af WHEN-sรฆtningen, og der er intet udtryk mellem CASE og WHEN.
F.eks: |
| 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: |
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: |
| Et simpelt tilfรฆlde understรธtter kun en lighedskontrol, dvs. om CASE_Expression = VALUE_1, VALUE_2โฆ
F.eks: |
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: |
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:
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:
CASE med OPDATERING
Antag igen, at vi har 'Guru99' tabel med to kolonner og fire rรฆkker, som vist nedenfor:
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:
Lad os spรธrge 'Guru99'-tabel for at kontrollere de opdaterede 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:
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.













