sql >> Database teknologi >  >> RDS >> Sqlserver

SQL CASE-sætning:Hvad er det, og hvad er de bedste måder at bruge det på?

En SQL CASE-sætning evaluerer og returnerer resultater baseret på bestemte værdier, prædikater og betingelser i henhold til defineret logik. Antag for eksempel, at du har en vælgertabel med følgende detaljer:

  • Vælger-id
  • Navn
  • DOB

Hvis du ledte efter logik omkring stemmeberettigelse, ville dette afhænge af værdierne i DOB-kolonnen.

Hvis en vælgers alder er over 18 år, er vedkommende stemmeberettiget.

Lad os se på et andet eksempel. Mange gange gemmer vi kolonneværdierne i bit 1 eller 0. Lad os sige, at du gemmer værdierne for et produkts tilgængelighed som 1 eller 0. For eksempel:

  • 1 =Produktet er tilgængeligt
  • 0 =Produktet er udsolgt

Hvis vi ser på databaseperspektivet, er det en god praksis at bruge forkortelserne eller bits, hvor det er muligt. Det er fordelagtigt for SQL Server-forespørgselsoptimeringsværktøjet til at udarbejde den optimerede udførelsesplan. Men fra et applikationsperspektiv kræver slutbrugeren ikke disse værdier. Kunder skal blot se, om produktet er tilgængeligt eller ej.

På billedet nedenfor ser vi både database- og applikationsperspektivet.

Hvad gør SQL CASE-sætningen?

En CASE-sætning i SQL Server evaluerer et udtryk og returnerer en værdi baseret på de definerede betingelser. Derfor fungerer CASE-sætningerne i det tidligere eksempel som vist nedenfor.

På et højt niveau er syntaksen for en SQL CASE-sætning vist nedenfor. Her har vi specificeret flere betingelser. SQL Server evaluerer betingelserne sekventielt. Når en betingelse er evalueret med succes, stopper den evalueringen af ​​de resterende forhold. Hvis ingen af ​​betingelserne er opfyldt, kan vi bruge en valgfri ELSE-sætning til at returnere standardværdien. For eksempel, hvis vi har en anden værdi end 0 og 1 i tilgængelighedskolonnen, får du output fra ELSE-kodeblokken. Det kræver mindst ét ​​sæt af NÅR- og SÅ-blokkene. CASE-sætningen skal slutte med END-blokken.

Lad os udforske SQL CASE-sætningen ved hjælp af forskellige eksempler.

Bemærk:I denne artikel bruger vi Microsofts eksempeldatabase, AdventureWorks. Du kan downloade dens sikkerhedskopi fra Microsoft Docs.

SELECT-sætningen med et simpelt CASE-udtryk

I denne type CASE-udsagn bruger vi udtryk for lighedstjek. Følgende forespørgsel implementerer et simpelt CASE-udtryk.

  • Hvis værdien i [SalariedFlag] er 1, viser det den aktive medarbejder
  • For alle andre værdier viser den output som Inaktiv medarbejder
VÆLG TOP 5 Nationalidnumber ,CASE salariedflagWHEN 1 THES 'Active Employee'ELSE 'Inactive Employee'ENDS SOM [Laried Flag]FRA [AdventureWorks2019].[HumanResources].[medarbejder]

Vi kan angive flere betingelser for CASE-sætningen.

VÆLG TOP 5 Nationalidnumber ,CASE salariedflagWHEN 1 THEN 'Active Employee'WHEN 0 THEN 'Inactive Employee'ELSE 'Invalid Value'END AS [Laried Flag]FRA [AdventureWorks2019].[HumanResources].[medarbejder]

Datastandardisering ved hjælp af SQL CASE-sætninger

Normalt bruger vi forkortelser til at gemme værdier i SQL-tabeller. Standardforkortelserne er køn, landekoder, ægteskabsstatus, populære produktnavne osv.

Antag, at vi angiver forkortelserne for lagring af medarbejdernes køn. Nu skulle vores applikation vise resultaterne uden nogen forkortelser.

SQL CASE-sætninger hjælper med at standardisere outputtet for definerede kriterier. I nedenstående forespørgsel bruger vi følgende betingelser:

  • Hvis kønsværdien er M , vis den som Mand
  • Hvis kønsværdien er F , vis den som Kvinde
  • For alle andre værdier skal du vise Ugyldig Værdi
VÆLG DISTINCT CASE genderWHEN 'M' SÅ 'Male'WHEN 'F' SÅ 'Female'ELSE 'Invalid Value'END AS GenderFROM AdventureWorks2019.HumanResources.Employee

Søgte CASE-udsagn

I den søgte CASE-sætning angiver vi et CASE-udtryk i stedet for de direkte værdier. Når udtryksværdien evaluerer og opfylder en betingelse i WHEN-udtrykket, returneres dens tilsvarende værdi.

Se nedenstående SQL-forespørgsel. Her definerede vi udtryk i WHEN-sætningen for [ListPrice]. Den identificerer, at produktets pris er $250 og er markeret som en elektronikvare.

VÆLG Produktnummer, Navn, [Produktkategori] =TILFÆLDE, NÅR ListePris =0 SÅ 'Udsolgte varer' NÅR ListePris> 0 og ListePris<=100 SÅ 'Forbrugsvarer' NÅR ListePris>100 og ListePris <=500 SÅ ' Elektronikvarer' NÅR Listepris>500 og Listepris <1500 SÅ 'Luksusvarer' ELSE 'Ekstra varer' SLUTTER FRA Produktion. Produktbestilling efter listeprisbeskrivelse

For det kønseksempel, der er nævnt tidligere, kan vi omskrive SQL CASE-sætningen for kønsforkortelserne ved hjælp af de søgte case-udsagn.

VÆLG DISTINCT CASE NÅR Gender='M' SÅ 'Male'WHEN Gender='F' SÅ 'Female'ELSE 'Invalid Value'END AS GenderFROM AdventureWorks2019.HumanResources.Employee

Brug af CASE-sætninger med ORDER BY-sætningen

SQL-forespørgsler bruger ORDER BY-udtrykket til datasortering i enten stigende eller faldende rækkefølge. Du kan bruge CASE-sætningerne sammen med ORDER BY-sætningen. Antag, at vi fra produkttabellen henter [ProductName] og [ListPrice]. Vi ønsker at sortere resultaterne på følgende måder:

  • Hvis produktlisteprisen er mindre end 2.000, vil du have resultatet i standardsorteringsrækkefølgen, dvs. stigende
  • Hvis produktlisteprisen er større end 2.000, resulterer ORDER BY-klausulen sortering i faldende rækkefølge

I denne forespørgsel bruger vi to SQL CASE-sætninger til at implementere logikken.

VÆLG Navn, ListePris FRA Produktion.ProductORDER BY CASEWHEN ListPrice<=2000 THEN ListPrice END ,CASE WHEN ListPrice>2000 THEN ListPrice END DESC

I nedenstående forespørgselsoutput kan du verificere datasorteringerne, der vises i både faldende og stigende rækkefølge.

Antag i et andet eksempel, at vi ønsker at sortere data i medarbejdertabellen baseret på følgende betingelse:

  • For aktive medarbejdere (Nuværende flag =1), skal data sortere kolonnen ansættelsesdato
  • For inaktive medarbejdere bør den sortere data i henhold til værdierne i kolonnen fødselsdato
VÆLG NationalIDNumber,JobTitle,Hiredate,BirthDate, currentflagFROM AdventureWorks2019.HumanResources.Employee ORDER BY CASE CURRENTFLAG NÅR 1 SÅ Ansættelsesdato ellers Fødselsdato slut

I forespørgselsoutputtet kan vi verificere datasorteringsrækkefølgen defineret af ORDER BY-sætningen og CASE-sætningerne.

CASE-sætning i SQL og aggregerede funktioner

Aggregerede funktioner i SQL Server udfører beregninger og returnerer en enkelt værdi. Eksempler på aggregerede funktioner er MIN, MAX, COUNT, ABG og CHECKSUM.

Antag, at vi ønsker at hente medarbejderantal for hvert år fra 2007-2010. Det skulle vise resultater i følgende format:

Til dette formål bruger vi COUNT aggregatfunktionen i SQL Server.

  • For det første filtrerer SQL DATEPART-funktionen data i henhold til året. For eksempel filtrerer DATEPART(YY, Hiredate)=2007 data for året 2007.
  • Vi bruger derefter CASE-sætningen til at returnere 1, hvis året er 2007.
  • Tælleaggregatets funktion tæller posterne og viser resultaterne.
  • På samme måde fungerer forespørgslen i de resterende år.
SELECT Count(CASEWHEN Datepart(yy, hiredate) =2007 THEN 1ELSE NULLEND) AS [2007Hires],Count(CASEWHEN Datepart(yy, hiredate) =2008 THEN 1ELSE NULLEND) AS [2008Hires],Counte(CASEWHEN)yEN , lejedato) =2009 THEN 1ELSE NULLEND) AS [2009Hires],Count(CASEWHEN Datepart(yy, hiredate) =2009 THEN 1ELSE NULLEND) AS [2010Hires]FRA AdventureWorks2019.HumanResources.Employee

Lad os på samme måde sige, at vi vil bruge den samlede funktion GROUP BY til at gruppere rækker med samme produktkategori. Vi kan angive CASE-sætningen i SQL for at sortere data fra det grupperede resultatsæt.

VÆLG [Produktkategori] =TILFÆLDE, NÅR listepris =0 SÅ 'Ikke på lager varer', NÅR listepris> 0 OG listepris <=100 SÅ 'Forbrugsvarer' NÅR listepris> 100 OG listepris <=500 SÅ 'Elektronik varer' NÅR listepris> 500 listepris <1500 SÅ 'Luksusvarer' ELSE 'Ekstra varer'END,Min(listepris) AS MinPrice,Max(listepris) AS MaxPrice,Count(listprice) AS Antal produkterFRA produktion.produktGRUPPE EFTER TILFÆLDE NÅR listepris =0 SÅ 'Ikke på lager varer' NÅR listepris> 0 OG listepris <=100 SÅ 'Forbrugsvarer' NÅR listepris> 100 OG listepris <=500 SÅ 'Elektronik varer'NÅR listepris> 500 OG listepris <1500 SÅ 'Luksusvarer' ELLER 'Ekstra varer 

I ovenstående forespørgsel bruger vi to SQL CASE-sætninger.

  • Den første CASE-sætning kategoriserer dataene baseret på det udtryk, der er defineret i listeprisen. Ved at bruge denne CASE-erklæring opdeler vi produkterne i følgende kategorier:
    • Ikke på lager varer
    • Forbrugsvarer
    • Elektroniske genstande
    • Luksusartikler
  • I den anden case-sætning bruger vi aggregatfunktionen GROUP BY til at gruppere resultatet efter kategorien
  • Yderligere sorterer vi resultaterne i henhold til NumberOfProducts i faldende rækkefølge

Undgå divider med nul fejl ved hjælp af SQL CASE-sætninger

En divider med nul fejl opstår, hvis nævnerværdien er nul. Hvis du laver disse brøker i SQL Server, vil det give dig divideret med nul fejl som vist nedenfor.

Det er en glimrende praksis at skrive dine forespørgsler på en måde, så du undgår disse almindelige fejl. For at undgå dette bruger vi brøklogikken inde i en CASE-sætning.

DECLARE @Student1 INTDECLARE @Student2 INTSET @Student1=100SET @Student2=0selectCASE WHEN @Student2=0THEN NULLELSE @Student1/@Student2 end as StudentMarksRatio

Vi har beskyttet vores forespørgsel fra dividere med nul fejl. Nu, med den modificerede logik, hvis vi får et nul i nævneren, får du NULL i output som vist nedenfor.

Nyttige påmindelser om SQL CASE-sætningen

  • SQL CASE-udsagn understøtter op til 10 niveauer af indlejring
  • Du kan ikke kontrollere strømmen af ​​eksekveringer af sætninger, funktioner eller procedurer ved hjælp af CASE-udtryk
  • Du bør altid bruge en ELSE-blok, så hvis nogen betingelser ikke er opfyldt, får du en standardværdi
  • Du bør undgå at bruge modstridende betingelser i SQL CASE-sætningen. CASE-sætningen fungerer sekventielt og stopper med at evaluere med den første succesfulde betingelse

  1. Switchover/Switchback i Slony-I under opgradering af PostgreSQL større versioner 8.4.x/9.3.x

  2. Sådan beregnes forskellen mellem to tidsstempler i SQLite

  3. Automatiser databasetestgendannelse i SQL Server

  4. SQL Server-indekser - stigende eller faldende, hvilken forskel gør det?