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.