sql >> Databasteknik >  >> RDS >> Sqlserver

SQL CASE-sats:Vad är det och vilka är de bästa sätten att använda den?

En SQL CASE-sats utvärderar och returnerar resultat baserat på särskilda värden, predikat och villkor enligt definierad logik. Anta till exempel att du har en väljartabell med följande detaljer:

  • Voter ID
  • Namn
  • DOB

Om du letade efter logik om röstberättigande, skulle detta bero på värdena i DOB-kolumnen.

Om en väljares ålder är högre än 18 år är de röstberättigade.

Låt oss titta på ett annat exempel. Många gånger lagrar vi kolumnvärdena i bitar 1 eller 0. Låt oss säga att du lagrar värdena för en produkts tillgänglighet som 1 eller 0. Till exempel:

  • 1 =Produkten är tillgänglig
  • 0 =Produkten är slut i lager

Om vi ​​tittar på databasperspektivet är det bra att använda förkortningarna eller bitarna där det är möjligt. Det är fördelaktigt för SQL Server-frågeoptimeraren att förbereda den optimerade exekveringsplanen. Men ur applikationsperspektivet kräver inte slutanvändaren dessa värden. Kunderna behöver bara se om produkten är tillgänglig eller inte.

I bilden nedan ser vi både databas- och applikationsperspektivet.

Vad gör SQL CASE-satsen?

En CASE-sats i SQL Server utvärderar ett uttryck och returnerar ett värde baserat på de definierade villkoren. Därför fungerar CASE-satserna i det tidigare exemplet som visas nedan.

På en hög nivå visas syntaxen för en SQL CASE-sats nedan. Här har vi angett flera villkor. SQL Server utvärderar villkoren sekventiellt. När ett villkor har utvärderats framgångsrikt, stoppar det utvärderingen av återstående villkor. Om inget av villkoren är uppfyllt kan vi använda en valfri ELSE-sats för att returnera standardvärdet. Till exempel, om vi har ett annat värde än 0 och 1 i tillgänglighetskolumnen, får du utdata från ELSE-kodblocket. Det kräver minst en uppsättning av NÄR- och DÅ-blocken. CASE-satsen måste sluta med END-blocket.

Låt oss utforska SQL CASE-satsen med hjälp av olika exempel.

Obs:I den här artikeln använder vi Microsofts exempeldatabas, AdventureWorks. Du kan ladda ner säkerhetskopian från Microsoft Docs.

SELECT-satsen med ett enkelt CASE-uttryck

I den här typen av CASE-uttryck använder vi uttryck för likhetskontroll. Följande fråga implementerar ett enkelt CASE-uttryck.

  • Om värdet i [SalariedFlag] är 1, visar det Active Employee
  • För alla andra värden visar den utdata som Inaktiv anställd
VÄLJ TOP 5 Nationalidnumber ,CASE salariedflagWHEN 1 THEN 'Active Employee'ELSE 'Inactive Employee'END SOM [Salaried Flag]FRÅN [AdventureWorks2019].[HumanResources].[employee]

Vi kan specificera flera villkor för CASE-satsen.

VÄLJ TOP 5 Nationalidnumber ,CASE salariedflagWHEN 1 THEN 'Active Employee'WHEN 0 THEN 'Inactive Employee'ELSE 'Invalid Value'END AS [Salaried Flag]FRÅN [AdventureWorks2019].[HumanResources].[anställd]

Datastandardisering med SQL CASE-satser

Vanligtvis använder vi förkortningar för att lagra värden i SQL-tabeller. Standardförkortningarna är kön, landskoder, äktenskapsstatus, populära produktnamn, etc.

Anta att vi anger förkortningarna för att lagra anställdas kön. Nu bör vår applikation visa resultaten utan några förkortningar.

SQL CASE-satser hjälper till att standardisera utdata för definierade kriterier. I frågan nedan använder vi följande villkor:

  • Om könsvärdet är M , visa den som Man
  • Om könsvärdet är F , visa den som Kvinna
  • För alla andra värden, visa Ogiltig Värde
VÄLJ DISTINKT CASE genderWHEN 'M' SEN 'Male'WHEN 'F' SEN 'Female'ELSE 'Invalid Value'END AS GenderFROM AdventureWorks2019.HumanResources.Employee

Sökade CASE-uttalanden

I den sökta CASE-satsen anger vi ett CASE-uttryck istället för de direkta värdena. När uttrycksvärdet utvärderas och uppfyller ett villkor i WHEN-satsen, returneras dess motsvarande värde.

Titta på SQL-frågan nedan. Här definierade vi uttryck i WHEN-satsen för [ListPrice]. Den identifierar att produktkostnaden är $250 och är markerad som en elektronikvara.

VÄLJ Produktnummer, Namn, [Produktkategori] =CASE NÄR ListPrice =0 SEN "Out of stock items" NÄR ListPrice> 0 och ListPrice<=100 SEDAN "Konsumensvaror" NÄR ListPrice>100 och ListPrice <=500 DÅ ' Elektronikartiklar" NÄR Listpris>500 och Listpris <1500 SÅ "Lyxartiklar" ANNARS "Extra varor" SLUTAR FRÅN produktion. Produktbeställning efter listprisbeskrivning

För det könsexempel som hänvisats till tidigare kan vi skriva om SQL CASE-satsen för könsförkortningarna med hjälp av de sökta fallsatserna.

VÄLJ DISTINKT FALL NÄR Gender='M' SEN 'Male'WHEN Gender='F' SEN 'Female' ELSE 'Ogiltigt värde' AVSLUTA SOM GenderFROM AdventureWorks2019.HumanResources.Employee

Använda CASE-satser med ORDER BY-satsen

SQL-frågor använder ORDER BY-satsen för datasortering i antingen stigande eller fallande ordning. Du kan använda CASE-satserna tillsammans med ORDER BY-satsen. Anta att vi hämtar [ProductName] och [ListPrice] från produkttabellen. Vi vill sortera resultaten på följande sätt:

  • Om produktlistpriset är lägre än 2 000, vill du ha resultatet i standardsorteringsordningen, d.v.s. stigande
  • Om produktlistpriset är högre än 2 000, resulterar sorteringen i ORDER BY-satsen i fallande ordning

I den här frågan använder vi två SQL CASE-satser för att implementera logiken.

VÄLJ Namn,ListPrisFrån Produktion.ProductORDER BY CASEWHEN ListPrice<=2000 THEN ListPrice END ,CASE NÄR ListPrice>2000 THEN ListPrice END DESC

I frågeutgången nedan kan du verifiera datasorteringen som visas i både fallande och stigande ordning.

I ett annat exempel, anta att vi vill sortera data i personaltabellen baserat på följande villkor:

  • För aktiva anställda (nuvarande flagga =1), bör data sortera kolumnen för anställningsdatum
  • För inaktiva anställda bör den sortera data enligt värdena i kolumnen födelsedatum
VÄLJ NationalIDNumber,JobTitle,Hiredate,BirthDate, currentflagFROM AdventureWorks2019.HumanResources.Employee BESTÄLLNING PER FALL CURRENTFLAG NÄR 1 DÅ Anställningsdatum annat Födelsedatum slut

I frågeutgången kan vi verifiera datasorteringsordningen som definieras av ORDER BY-satsen och CASE-satserna.

CASE-sats i SQL och aggregerade funktioner

Aggregatfunktioner i SQL Server utför beräkningar och returnerar ett enda värde. Exempel på aggregatfunktioner är MIN, MAX, COUNT, ABG och CHECKSUM.

Anta att vi vill hämta antalet anställda för varje år från 2007-2010. Den ska visa resultat i följande format:

För detta ändamål använder vi COUNT-aggregatfunktionen i SQL Server.

  • Först filtrerar SQL DATEPART-funktionen data efter år. Till exempel filtrerar DATEPART(YY, Hiredate)=2007 data för år 2007.
  • Vi använder sedan CASE-satsen för att returnera 1 om året är 2007.
  • Räkneaggregatsfunktionen räknar posterna och visar resultaten.
  • På liknande sätt fungerar frågan under de återstående åren.
SELECT Count(CASEWHEN Datepart(yy, hiredate) =2007 THEN 1ELSE NULLEND) AS [2007Hires],Count(CASEWHEN Datepart(yy, hiredate) =2008 THEN 1ELSE NULLEND) AS [2008Hires],Count(CASEWHEN(CASEWHEN) , hiredate) =2009 THEN 1ELSE NULLEND) AS [2009Hires],Count(CASEWHEN Datepart(yy, hiredate) =2009 THEN 1ELSE NULLEND) AS [2010Hires]FRÅN AdventureWorks2019.HumanResources.Employee

På samma sätt, låt oss säga att vi vill använda aggregatfunktionen GROUP BY för att gruppera rader med samma produktkategori. Vi kan specificera CASE-satsen i SQL för att sortera data från den grupperade resultatuppsättningen.

VÄLJ [Produktkategori] =FALL NÄR listpris =0 DÅ "Ej i lager" NÄR listpris> 0 OCH listpris <=100 DÅ "Konsumentvaror" NÄR listpris> 100 OCH listpris <=500 SEN "Elektronikartiklar" NÄR listpris> 500 listpris <1500 SEN 'Lyxvaror' ANDELS 'Extra artiklar'END,Min(listpris) AS MinPrice,Max(listprice) AS MaxPrice,Count(listprice) AS Antal produkterFRÅN produktion.produktGROUP EFTER FALL NÄR listpris =0 SEN 'Ej i lager artiklar' NÄR listpris> 0 OCH listpris <=100 DÅ 'Konsumentvaror' NÄR listpris> 100 OCH listpris <=500 DÅ 'Elektronikartiklar' NÄR listpris> 500 OCH listpris <1 500 DÅ 'Lyxvaror' ANNARS 'Extra artiklar 

I ovanstående fråga använder vi två SQL CASE-satser.

  • Den första CASE-satsen kategoriserar data baserat på uttrycket som definieras i listpriset. Med denna CASE-sats delar vi in ​​produkterna i följande kategorier:
    • Ej i lager artiklar
    • Konsumentvaror
    • Elektroniska föremål
    • Lyxartiklar
  • I den andra fallsatsen använder vi aggregatfunktionen GROUP BY för att gruppera resultatet efter kategori
  • Vidare sorterar vi resultaten enligt NumberOfProducts i fallande ordning

Förhindra dividering med noll-fel med SQL CASE-satser

Ett divideringsfel med noll uppstår om nämnarvärdet är noll. Om du gör dessa bråk i SQL Server, kommer det att ge dig divideringen med noll-felet som visas nedan.

Det är en utmärkt praxis att skriva dina frågor på ett sätt för att undvika dessa vanliga misstag. För att undvika detta använder vi bråklogiken i en CASE-sats.

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

Vi har skyddat vår fråga från dela med noll-fel. Nu, med den modifierade logiken, om vi får en nolla i nämnaren, får du NULL i utdata som visas nedan.

Användbara påminnelser om SQL CASE-satsen

  • SQL CASE-satser stöder upp till 10 nivåer av kapsling
  • Du kan inte kontrollera flödet av exekveringar av satserna, funktionerna eller procedurerna med hjälp av CASE-uttryck
  • Du bör alltid använda ett ELSE-block så att om några villkor inte är uppfyllda får du ett standardvärde
  • Du bör undvika att använda motstridiga villkor i SQL CASE-satsen. CASE-satsen fungerar sekventiellt och slutar utvärdera med det första framgångsrika villkoret

  1. Hur programmerar man en MySQL-utlösare för att infoga rad i en annan tabell?

  2. Hur man hämtar poster från de senaste 24 timmarna i MySQL

  3. Hur undkommer man apostrof (') i MySql?

  4. MariaDB JSON_REPLACE() Förklarad