Sök…


Introduktion

CASE-uttrycket används för att implementera if-sedan-logik.

Syntax

  • CASE input_xpress
    NÄR Jämför1 DÅ resultat1
    [NÄR Jämför2 DÅ resultat2] ...
    [ELSE-resultatX]
    SLUTET
  • FALL
    NÄR villkor1 DÅ resultat1
    [NÄR villkor2 DÅ resultat2] ...
    [ELSE-resultatX]
    SLUTET

Anmärkningar

Det enkla CASE-uttrycket returnerar det första resultatet vars compareX värde är lika med input_expression .

Det sökta CASE-uttrycket returnerar det första resultatet vars conditionX är sant.

Sökte FALL i VÄLJ (Matchar ett booleskt uttryck)

Det sökta fallet ger resultat när ett booleskt uttryck är SANT.

(Detta skiljer sig från det enkla fallet, som bara kan kontrollera om det är likvärdigt med en ingång.)

SELECT Id, ItemId, Price,
  CASE WHEN Price < 10 THEN 'CHEAP'
       WHEN Price < 20 THEN 'AFFORDABLE'
       ELSE 'EXPENSIVE'
  END AS PriceRating
FROM ItemSales
Id Artikelnummer Pris PriceRating
1 100 34,5 DYR
2 145 2,3 BILLIG
3 100 34,5 DYR
4 100 34,5 DYR
5 145 10 PRISVÄRD

Använd CASE för att COUNT antalet rader i en kolumn matchar ett villkor.

Användningsfall

CASE kan användas tillsammans med SUM att returnera ett antal endast de objekt som matchar ett fördefinierat tillstånd. (Detta liknar COUNTIF i Excel.)

Tricket är att returnera binära resultat som indikerar matchningar, så att "1" s som returneras för matchande poster kan summeras för ett räkning av det totala antalet matcher.

Med den här tabellen ItemSales , låt oss säga att du vill lära dig det totala antalet objekt som har kategoriserats som "Expensive":

Id Artikelnummer Pris PriceRating
1 100 34,5 DYR
2 145 2,3 BILLIG
3 100 34,5 DYR
4 100 34,5 DYR
5 145 10 PRISVÄRD

Fråga

SELECT 
    COUNT(Id) AS ItemsCount,
    SUM ( CASE 
            WHEN PriceRating = 'Expensive' THEN 1
            ELSE 0
          END
        ) AS ExpensiveItemsCount
FROM ItemSales 

Resultat:

ItemsCount ExpensiveItemsCount
5 3

Alternativ:

SELECT 
    COUNT(Id) as ItemsCount,
    SUM (
        CASE PriceRating 
            WHEN 'Expensive' THEN 1
            ELSE 0
        END
       ) AS ExpensiveItemsCount
FROM ItemSales 

Kortfattad FALL i VÄLJ

CASE korta variant utvärderar ett uttryck (vanligtvis en kolumn) mot en serie värden. Denna variant är lite kortare och sparar upprepade gånger det utvärderade uttrycket. ELSE klausulen kan fortfarande användas, dock:

SELECT Id, ItemId, Price,
  CASE Price WHEN 5  THEN 'CHEAP'
             WHEN 15 THEN 'AFFORDABLE'
             ELSE         'EXPENSIVE'
  END as PriceRating
FROM ItemSales

Ett försiktighetsord. Det är viktigt att inse att när du använder den korta varianten utvärderas hela uttalandet vid varje WHEN . Därför följande uttalande:

SELECT 
    CASE ABS(CHECKSUM(NEWID())) % 4
        WHEN 0 THEN 'Dr'
        WHEN 1 THEN 'Master'
        WHEN 2 THEN 'Mr'
        WHEN 3 THEN 'Mrs'
    END

kan ge ett NULL resultat. Det beror på att WHEN NEWID() kallas igen med ett nytt resultat. Ekvivalent med:

SELECT 
    CASE 
        WHEN ABS(CHECKSUM(NEWID())) % 4 = 0 THEN 'Dr'
        WHEN ABS(CHECKSUM(NEWID())) % 4 = 1 THEN 'Master'
        WHEN ABS(CHECKSUM(NEWID())) % 4 = 2 THEN 'Mr'
        WHEN ABS(CHECKSUM(NEWID())) % 4 = 3 THEN 'Mrs'
    END

Därför kan den missa alla WHEN fall och resultat som NULL .

FALL i en klausul ORDER BY

Vi kan använda 1,2,3 .. för att bestämma beställningstypen:

SELECT * FROM DEPT
ORDER BY
CASE DEPARTMENT
      WHEN 'MARKETING' THEN  1
      WHEN 'SALES' THEN 2
      WHEN 'RESEARCH' THEN 3
      WHEN 'INNOVATION' THEN 4
      ELSE        5
      END,
      CITY
ID OMRÅDE STAD AVDELNING EMPLOYEES_NUMBER
12 Nya England Boston MARKNADSFÖRING 9
15 väst San Francisco MARKNADSFÖRING 12
9 Midwest chicago FÖRSÄLJNING 8
14 Mid-Atlantic New York FÖRSÄLJNING 12
5 väst Los Angeles FORSKNING 11
10 Mid-Atlantic Philadelphia FORSKNING 13
4 Midwest chicago INNOVATION 11
2 Midwest Detroit PERSONALAVDELNING 9

Använda CASE i UPDATE

prov på prisökningar:

UPDATE ItemPrice
SET Price = Price *
  CASE ItemId
    WHEN 1 THEN 1.05
    WHEN 2 THEN 1.10
    WHEN 3 THEN 1.15
    ELSE 1.00
  END

CASE-användning för NULL-värden som senast beställts

på detta sätt rankas '0' som representerar de kända värdena först, '1' som representerar NULL-värdena sorteras efter det sista:

SELECT ID
      ,REGION
      ,CITY
      ,DEPARTMENT
      ,EMPLOYEES_NUMBER
  FROM DEPT
  ORDER BY 
  CASE WHEN REGION IS NULL THEN 1 
  ELSE 0
  END, 
  REGION
ID OMRÅDE STAD AVDELNING EMPLOYEES_NUMBER
10 Mid-Atlantic Philadelphia FORSKNING 13
14 Mid-Atlantic New York FÖRSÄLJNING 12
9 Midwest chicago FÖRSÄLJNING 8
12 Nya England Boston MARKNADSFÖRING 9
5 väst Los Angeles FORSKNING 11
15 NULL San Francisco MARKNADSFÖRING 12
4 NULL chicago INNOVATION 11
2 NULL Detroit PERSONALAVDELNING 9

FALL i ORDER BY-klausul för att sortera poster efter lägsta värde på 2 kolumner

Föreställ dig att du behöver sortera poster efter det lägsta värdet på endera av två kolumner. Vissa databaser kan använda en icke-aggregerad MIN() eller LEAST() -funktion för den här ( ... ORDER BY MIN(Date1, Date2) ), men i standard SQL måste du använda ett CASE uttryck.

CASE uttrycket i frågan nedan tittar på Date1 och Date2 , kontrollerar vilken kolumn som har det lägsta värdet och sorterar posterna beroende på detta värde.

Stickprov

Id datum1 datum2
1 2017/01/01 2017/01/31
2 2017/01/31 2017/01/03
3 2017/01/31 2017/01/02
4 2017/01/06 2017/01/31
5 2017/01/31 2017/01/05
6 2017/01/04 2017/01/31

Fråga

SELECT Id, Date1, Date2
FROM YourTable
ORDER BY CASE 
           WHEN COALESCE(Date1, '1753-01-01') < COALESCE(Date2, '1753-01-01') THEN Date1 
           ELSE Date2 
         END

Resultat

Id datum1 datum2
1 2017/01/01 2017/01/31
3 2017/01/31 2017/01/02
2 2017/01/31 2017/01/03
6 2017/01/04 2017/01/31
5 2017/01/31 2017/01/05
4 2017/01/06 2017/01/31

Förklaring

Som du ser rad med Id = 1 är först, det eftersom Date1 har lägsta post från hela tabellen 2017-01-01 , rad där Id = 3 är andra än att Date2 lika med 2017-01-02 som är det näst lägsta värdet från tabellen och så vidare.

Så vi har sorterat poster från 2017-01-01 till 2017-01-06 stigande och ingen omsorg i vilken kolumn Date1 eller Date2 är dessa värden.



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow