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.