Zoeken…


Invoering

De uitdrukking CASE wordt gebruikt om if-then-logica te implementeren.

Syntaxis

  • CASE invoer_expressie
    WANNEER vergelijken1 DAN resultaat1
    [WANNEER vergelijken2 DAN resultaat2] ...
    [ELSE resultX]
    EINDE
  • GEVAL
    WANNEER voorwaarde1 DAN resultaat1
    [WANNEER voorwaarde2 DAN resultaat2] ...
    [ELSE resultX]
    EINDE

Opmerkingen

De eenvoudige CASE-expressie retourneert het eerste resultaat waarvan de compareX waarde gelijk is aan de input_expression .

De gezochte expressie CASE retourneert het eerste resultaat waarvan de conditionX waar is.

Gezocht CASE in SELECT (komt overeen met een booleaanse uitdrukking)

De gezochte CASE geeft resultaten wanneer een booleaanse uitdrukking WAAR is.

(Dit verschilt van het eenvoudige geval, dat alleen kan controleren op gelijkwaardigheid met een invoer.)

SELECT Id, ItemId, Price,
  CASE WHEN Price < 10 THEN 'CHEAP'
       WHEN Price < 20 THEN 'AFFORDABLE'
       ELSE 'EXPENSIVE'
  END AS PriceRating
FROM ItemSales
ID kaart Item ID Prijs PriceRating
1 100 34.5 DUUR
2 145 2.3 GOEDKOOP
3 100 34.5 DUUR
4 100 34.5 DUUR
5 145 10 BETAALBARE

Gebruik CASE om het aantal rijen in een kolom overeen te laten komen met een voorwaarde.

Gebruik case

CASE kan worden gebruikt in combinatie met SUM om alleen een aantal items te retourneren die overeenkomen met een vooraf gedefinieerde voorwaarde. (Dit is vergelijkbaar met COUNTIF in Excel.)

De truc is om binaire resultaten terug te geven die overeenkomsten aangeven, zodat de "1" s voor overeenkomende vermeldingen kunnen worden opgeteld voor een telling van het totale aantal overeenkomsten.

Gegeven deze tabel ItemSales , laten we zeggen dat u het totale aantal items wilt leren kennen dat gecategoriseerd is als "Duur":

ID kaart Item ID Prijs PriceRating
1 100 34.5 DUUR
2 145 2.3 GOEDKOOP
3 100 34.5 DUUR
4 100 34.5 DUUR
5 145 10 BETAALBARE

vraag

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

resultaten:

ItemsCount ExpensiveItemsCount
5 3

Alternatief:

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

Steno CASE in SELECT

CASE 's stenovariant evalueert een uitdrukking (meestal een kolom) op basis van een reeks waarden. Deze variant is iets korter en slaat het herhalen van de geëvalueerde uitdrukking steeds opnieuw op. De ELSE clausule kan echter nog steeds worden gebruikt:

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

Een woord van waarschuwing. Het is belangrijk om te beseffen dat bij gebruik van de korte variant de hele instructie bij elke WHEN wordt geëvalueerd. Daarom de volgende verklaring:

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

kan een NULL resultaat veroorzaken. Dat komt omdat bij elke WHEN NEWID() opnieuw wordt aangeroepen met een nieuw resultaat. Gelijk aan:

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

Daarom kan het alle WHEN gevallen missen en resulteren als NULL .

GEVAL in een clausule BESTELLEN BIJ

We kunnen 1,2,3 gebruiken om het type bestelling te bepalen:

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 kaart REGIO STAD AFDELING EMPLOYEES_NUMBER
12 Nieuw Engeland Boston MARKETING 9
15 westen San Francisco MARKETING 12
9 Midwest Chicago VERKOOP 8
14 Mid-Atlantic New York VERKOOP 12
5 westen Los Angeles ONDERZOEK 11
10 Mid-Atlantic Philadelphia ONDERZOEK 13
4 Midwest Chicago INNOVATIE 11
2 Midwest Detroit PERSONEELSZAKEN 9

CASE gebruiken in UPDATE

voorbeeld van prijsverhogingen:

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 gebruik voor NULL laatst bestelde waarden

op deze manier wordt '0' die de bekende waarden vertegenwoordigt eerst gerangschikt, wordt '1' die de NULL-waarden representeert, als laatste gesorteerd:

SELECT ID
      ,REGION
      ,CITY
      ,DEPARTMENT
      ,EMPLOYEES_NUMBER
  FROM DEPT
  ORDER BY 
  CASE WHEN REGION IS NULL THEN 1 
  ELSE 0
  END, 
  REGION
ID kaart REGIO STAD AFDELING EMPLOYEES_NUMBER
10 Mid-Atlantic Philadelphia ONDERZOEK 13
14 Mid-Atlantic New York VERKOOP 12
9 Midwest Chicago VERKOOP 8
12 Nieuw Engeland Boston MARKETING 9
5 westen Los Angeles ONDERZOEK 11
15 NUL San Francisco MARKETING 12
4 NUL Chicago INNOVATIE 11
2 NUL Detroit PERSONEELSZAKEN 9

CASE in clausule ORDER BY om records te sorteren op laagste waarde van 2 kolommen

Stel je voor dat je records moet sorteren op laagste waarde van een van de twee kolommen. Sommige databases kunnen hiervoor een niet-geaggregeerde MIN() of LEAST() functie gebruiken ( ... ORDER BY MIN(Date1, Date2) ), maar in standaard SQL moet u een CASE expressie gebruiken.

De CASE expressie in de query beneden kijkt naar de Date1 en Date2 kolommen, controleert welke kolom de laagste waarde en De records afhankelijk van deze waarde.

Voorbeeldgegevens

ID kaart datum1 date2
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

vraag

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

resultaten

ID kaart datum1 date2
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

Uitleg

Zoals u ziet, is rij met Id = 1 eerste, omdat Date1 het laagste record uit de hele tabel heeft 2017-01-01 , rij waar Id = 3 tweede is, omdat Date2 gelijk is aan 2017-01-02 dat de op een na laagste waarde is uit de tabel enzovoorts.

Dus we hebben gesorteerde records van 2017-01-01 tot 2017-01-06 opgaande en geen zorg waarop één kolom Date1 of Date2 zijn die waarden.



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow