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.













