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.