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.

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:
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.
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.
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.
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:
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.
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.
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: |
CASE-nรธkkelordet etterfรธlges av WHEN-setningen, og det er ikke noe uttrykk mellom CASE og WHEN.
Eg: |
| 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: |
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: |
| Et enkelt tilfelle stรธtter bare en likhetssjekk, dvs. om CASE_Expression = VALUE_1, VALUE_2โฆ
Eg: |
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: |
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:
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:
CASE med OPPDATERING
Anta igjen at vi har 'Guru99' tabell med to kolonner og fire rader, som vist nedenfor:
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:
La oss spรธrre etter 'Guru99'-tabellen for รฅ sjekke de oppdaterte verdiene:
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:
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.













