Introduktion
CASE-udtryk i SQL Server bruges til substitution af kolonneværdier for at præsentere resultatsættene på en bestemt måde eller simple forespørgsler. Brugstilfælde for sådanne kommandoer er forskellige.
For eksempel er der en kolonne, der indeholder afdelingskoden, men du ønsker at vise afdelingens navn frem for koden. Du kan opnå det ved at lave en JOIN med en anden tabel, der indeholder afdelingsdetaljerne. Lad os dog antage, at du vil holde forespørgslen relativt enkel. Et andet anvendelsestilfælde ville være at returnere specifikke værdier for de beregnede værdier. Beregnede kolonner ville ikke passe, hvis sæt betingelser, der skal specificeres, ikke er de samme.
Typisk har SQL Server CASE-udtryk den form, der er vist i Listing 1.
-- Liste 1:CASE Expression Syntaks-- Simple CASE ExpressionSELECT col1, col2, CASE col3WHEN 'a' SÅ 'xxx'WHEN 'b' SÅ 'yyy'WHEN 'c' SÅ 'zzz'ELSE ' Ugyldig værdi'END AS col3_nameFROM table_name;-- Søgte CASE ExpressionSELECT col1, col2, CASEWHEN col3 =1 SÅ 'xxx'NÅR kol3 MELLEM 2 og 9 SÅ 'yyy'NÅR col3> 10 SÅ 'zzz'ELSE 'Ugyldig værdi'END AS col3_nameFROM tabelnavn;
Simpel sag og søgt sag
De to ovenstående scenarier passer ganske fint ind i de to typer CASE-udtryk, der er tilgængelige i SQL Server. Et simpelt CASE-udtryk tillader kun ligestillingskontrol. Et søgt CASE-udtryk tillader endda booleske udtryk.
Bemærk, at resultaterne af et CASE-udtryk passer ind i en enkelt kolonne. Bemærk også, at vi angiver kolonnenavnet lige efter CASE-udtrykket i Simple CASE-udtrykket. I det søgte CASE-udtryk skal vi dog angive kolonnenavnet for hvert boolsk udtryk. Lad os se på nogle eksempler.
Scenariomiljø
I vores udforskning af CASE-udtrykket skal vi bruge den velkendte WideWorldImporters-eksempeldatabase. Der bruger vi Sales.CustomerTransactions tabel for at demonstrere forskellige scenarier for CASE-ekspressionsapplikationen. Som det er almindeligt med T-SQL, er det muligt at få lignende resultater ved hjælp af andre teknikker, såsom JOINs, men vi fokuserer på én tabel for at vise CASE-udtryksmulighederne.
Bemærk, at man skal forstå de håndterede data for at bruge CASE-udtryk. Vi skal f.eks. vide, hvad hver kunde kode betyder at repræsentere dataene med mere mening for slutbrugeren. I vores tilfælde kan vi få oplysningerne fra andre tabeller.
Liste 2 er en simpel forespørgsel, der viser, hvordan dataene i tabellen ser ud. Figur 1 viser os en outputdel.
-- Liste 2:Datasæt i Sales.CustomerTransactionsSELECT TOP (1000) [CustomerTransactionID] , [CustomerID] , [TransactionTypeID] , [InvoiceID] , [PaymentMethodID] , [TransactionDate] , [Amount]Excluding, [Amount]Excluding TaxAmount], [TransactionAmount], [OutstandingBalance], [FinalizationDate], [IsFinalized], [LastEditedBy] , [LastEditedWhen] FRA [WideWorldImporters].[Salg].[CustomerTransactions];
Returnering af kundenavne baseret på kunde-id
I dette eksempel ønsker vi at vise navnet på hver kunde baseret på kundekoden. Vi henter kundernes navne fra en anden tabel ved hjælp af en JOIN-forespørgsel. Igen bruger vi CASE-udtrykket til at demonstrere, hvad denne tilgang kan.
-- Fortegnelse 3a:Bestem navne ved hjælp af en Joinselect distinkt top 10 b.CustomerID, a.CustomerNamefrom Sales.Customers a,Sales.CustomerTransactions bhvor a.CustomerID =b.CustomerID;
-- Liste 3b:Bestem navne ved hjælp af en Join (Alternativ) vælg særskilte top 10 b.CustomerID, a.CustomerNamefrom Sales.Customers ainner join Sales.CustomerTransactions bon a.CustomerID =b.CustomerID;
Med disse oplysninger skriver vi en simpel CASE-forespørgsel for at hente data fra Sales.CustomerTransactions alene (se liste 4). Figur 3 fremhæver de navne, der returneres af forespørgslen.
Bemærk forekomsten af 'Ukendte kunder' i outputtet. I egentlig forstand er disse kunder ikke ukendte. Vi har dem ikke, fordi vi ikke tog højde for deres Kunde-ID i vores CASE-udtryk. Dette underbygger behovet for at forstå dataene, når du bruger CASE-udtryk.
-- Liste 4:Simpelt CASE-udtryk for kundenavnVÆLG TOP (20) CASE Kunde-ID NÅR 1 SÅ 'Tailspin Toys' NÅR 401 SÅ 'Wingtip Toys' NÅR 801 SÅ 'Eric Torres' NÅR 802 SÅ 'Cosmina Vlad' ' NÅR 803 SÅ 'Bala Dixit' NÅR 804 SÅ 'Alekxandrs Reikstins' NÅR 805 SÅ 'Ratan Podder' NÅR 806 SÅ 'Shi Tu' NÅR 807 SÅ 'Gunnar Lohmus' NÅR 808 SÅ Customer'Jacknios' CustomerName 'Jacknios'. , [InvoiceID], [TransactionDate], [TransactionAmount] , [OutstandingBalance] , [IsFinalized], [FinalizationDate], [LastEditedBy] , [LastEditedWhen] FRA [WideWorldImporters].[Sales].[Cus];
Returnering af kundeklassen baseret på transaktionsbeløbet
I dette eksempel bruger vi Searched CASE-udtrykket til at vise, hvilke af vores kunder der har størst værdi med hensyn til transaktionsværdien.
Vi klassificerer kunderne i tre grupper – Almindelig, Sølv, Guld og Platin, baseret på transaktionsværdien. Dette er selvfølgelig forenklet. I et scenarie i den virkelige verden skal vi summere deres transaktioner over en given periode. I dette tilfælde bruger vi kun et dataundersæt til at vise CASE-udtryksfunktionerne.
-- Liste 5:Søgte case-udtryk for kundeklasse VÆLG TOP (20) CASE Kunde-ID NÅR 1 SÅ 'Tailspin Toys' NÅR 401 SÅ 'Wingtip Toys' NÅR 801 SÅ 'Eric Torres' NÅR 802 SÅ 'Cosmina' Vlad' NÅR 803 SÅ 'Bala Dixit' NÅR 804 SÅ 'Alekxandrs Reikstins' NÅR 805 SÅ 'Ratan Podder' NÅR 806 SÅ 'Shi Tu' NÅR 807 SÅ 'Gunnar Lohmus' NÅR 808 SÅ kendt 'Jackern' CustomerName , [InvoiceID] , [TransactionDate] , CASE NÅR [TransactionAmount] MELLEM 100 OG 1000 THEN 'Sølvkunde' NÅR [TransactionAmount] MELLEM 1000 OG 3000 THEN 'Gold Customer' WHEN THE='3000 Customer'> 'Almindelig kunde' SLUT SOM CustomerClass, [OutstandingBalance], [IsFinalized], [FinalizationDate], [LastEditedBy], [LastEditedWhen] FRA [WideWorldImporters].[Salg].[CustomerTransactions];
Tilbageføring af ugedagen ved hjælp af indlejrede CASE-udtryk
Vi fortsætter med prøverne ved at tilføje en prøve, der fortæller os, hvilken ugedag transaktionsdatoen var (se liste 6). Bemærk, at vi kunne have opnået dette ved at bruge en meget enklere form for forespørgslen ved hjælp af DATENAME-funktionen i stedet for DATEPART-funktionen.
-- Liste 6:Sagsudtryk for ugedag ved hjælp af en funktion VÆLG TOP (20) CASE Kunde-ID NÅR 1 SÅ 'Tailspin Toys' NÅR 401 SÅ 'Wingtip Toys' NÅR 801 SÅ 'Eric Torres' NÅR 802 SÅ 'Cosmina Vlad' NÅR 803 SÅ 'Bala Dixit' NÅR 804 SÅ 'Alekxandrs Reikstins' NÅR 805 SÅ 'Ratan Podder' NÅR 806 SÅ 'Shi Tu' NÅR 807 SÅ 'Gunnar Lohmus' NÅR 'Kolelsenunnar Lohmus' NÅR '80nioskendt '80nios'. Customer'END CustomerName , [InvoiceID], CASE WHEN DATEPART(WEEKDAY,[TransactionDate]) =1 THES 'Sunday' WHEN DATEPART(WEEKDAY,[TransactionDate]) =2 SÅ 'Mandag' WHEN DATEPART(WEEKDAY,[TransactionDate]) =3 THEN 'Tuesday' WHEN DATEPART(WEEKDAY,[TransactionDate]) =4 THEN 'Wednesday' WHEN DATEPART(WEEKDAY,[TransactionDate]) =5 SÅ 'Torsdag' WHEN DATEPART(WEEKDAY,[TransactionDate]) =6' SÅ 'Friday' WHEN DATEPART(WEEKDAY,[TransactionDate]) =7 THEN 'Saturday' END AS [Day of Week], CASE WHN [TransactionAmount] MELLEM 100 OG 1000 SÅ 'Sølvkunde' NÅR [Transactio nAmount] MELLEM 1000 OG 3000 THEN 'Gold Customer' NÅR [TransactionAmount]>=3000 THEN 'Platinum Customer' ELSE 'Regular Customer' ENDS AS CustomerClass , [OutstandingBalance] , [IsFinalized] , [FinalizationDate]EditedLasted, ] FRA [WideWorldImporters].[Salg].[Kundetransaktioner];
Mærkning af transaktioner baseret på dato
Ved at bruge koden i lister 7 og 8 kan vi mærke transaktioner baseret på forskellen mellem den aktuelle dato og transaktionsdatoen. Det gælder også forskellen mellem transaktionsdatoen og en anden kolonne. Derfor kan vi introducere andre kolonner end dem, vi arbejder med, som input til et boolsk udtryk.
-- Liste 7:Case-udtryk for transaktion ved at sammenligne to "kolonner" VÆLG TOP (20) CASE Kunde-ID NÅR 1 SÅ 'Tailspin Toys' NÅR 401 SÅ 'Wingtip Toys' NÅR 801 SÅ 'Eric Torres' NÅR 802 SÅ 'Cosmina Vlad' NÅR 803 SÅ 'Bala Dixit' NÅR 804 SÅ 'Alekxandrs Reikstins' NÅR 805 SÅ 'Ratan Podder' NÅR 806 SÅ 'Shi Tu' NÅR 807 SÅ 'Gunnar 'JELSEN 808' WOLHUSSON 'Gunnar' Lohmusson' Ukendt kunde'END Kundenavn , [FakturaID], CASE NÅR DATEDIFF(DAY,[TransactionDate],GETDATE()) <30 SÅ 'Nuværende transaktion' NÅR DATEDIFF(DAY,[TransactionDate],GETDATE()) MELLEM 30 OG 90 SÅ ' Old Transaction' WHEN DATEDIFF(DAY,[TransactionDate],GETDATE()) MELLEM 90 OG 365 SÅ 'Uforældet transaktion' NÅR DATEDIFF(DAY,[TransactionDate],GETDATE())>=365 SÅ 'Arkiveret transaktion' ENDER SOM [Transaktion' Alder], CASE WHEN [TransactionAmount] MELLEM 100 AND 1000 THEN 'Sølvkunde' NÅR [TransactionAmount] BTWEEN 1000 AND 3000 THEN 'Gold Customer' WHEN [Transacti onAmount]>=3000 THEN 'Platinum Customer' ELSE 'Regular Customer' END AS CustomerClass , [OutstandingBalance], [IsFinalized], [FinalizationDate] , [LastEditedBy] , [LastEditedWhen] FROM [WideWorldImporters]Transactions][tomusporters.C];
-- Liste 8:Caseudtryk for transaktion ved at sammenligne to kolonner VÆLG TOP (20) CASE Kunde-ID NÅR 1 SÅ 'Tailspin Toys' NÅR 401 SÅ 'Wingtip Toys' NÅR 801 SÅ 'Eric Torres' NÅR 802 SÅ 'Cosmina Vlad' NÅR 803 SÅ 'Bala Dixit' NÅR 804 SÅ 'Alekxandrs Reikstins' NÅR 805 SÅ 'Ratan Podder' NÅR 806 SÅ 'Shi Tu' HVORNÅR 807 SÅ 'Gunnar Lohmus' THENWAN 'ELSESON' 808Unio kendte'. 'END CustomerName , [InvoiceID], CASE WHEN DATEDIFF(DAY,[TransactionDate],[FinalizationDate]) <30 THEN 'Prompt Transaction' WHEN DATEDIFF(DAY,[TransactionDate],[FinalizationDate]) MELLEM 30 OG 90 SÅ 'Forsinket transaktion' ' WHEN DATEDIFF(DAY,[TransactionDate],[FinalizationDate]) MELLEM 90 OG 365 THEN 'Serverely Delayed Transaction' WHEN DATEDIFF(DAY,[TransactionDate],[FinalizationDate])>=365 THEN 'Forældreløs transaktion'-svar END AS [Transaktionsdato] ], CASE NÅR [TransactionAmount] MELLEM 100 OG 1000 SÅ "Sølvkunde" NÅR [TransactionAmount] BETW EEN 1000 OG 3000 SÅ 'Guldkunde' NÅR [TransactionAmount]>=3000 THEN 'Platinum Customer' ELSE 'Almindelig kunde' SLUTTER SOM CustomerClass, [OutstandingBalance] , [IsFinalized], [FinalizationDate] , [LastEdited,WhenLasted] [WideWorldImporters].[Salg].[Kundetransaktioner];
CASE-udtryk uden for SELECT-listen
Vi kan også bruge CASE-udtryk i SET-sætninger, UPDATE-sætninger, WHERE-sætninger, HAVING-sætninger og ORDER BY-sætninger.
Opdateringserklæringen i liste 9 opdaterer OutstandingBalance kolonne af rækker med fire forskellige kunde-id'er med forskellige værdier. Denne erklæring svarer til at skrive fem forskellige opdateringssætninger for hver CASE og derefter ELSE.
-- Fortegnelse 9:Opdater erklæring med CASE-udtryk OPDATERING Salg.Kundetransaktioner SET OutstandingBalance =(CASE NÅR Kunde-ID =832 SÅ 100,00 NÅR Kunde-ID =803 SÅ 150,00 NÅR Kunde-ID =9005.00N =9005.0N. 50,00 SLUT ); VÆLG TOP 20 * FRA Salg.Kundetransaktioner;
Konklusion
SQL og T-SQL giver dig mulighed for at erstatte værdier gemt i en kolonne med dine ønskede værdier. I denne artikel har vi udforsket Simple og Searched CASE-udtryk med eksempler.
CASE-udtryk kan bruges på SELECT-sætninger, SET-sætninger, UPDATE-sætninger, WHERE, HAVING og ORDER BY-sætninger.
Referencer
SAG
Dato- og tidsfunktioner