Problem:
Du vill använda en CASE-sats i SQL.
Exempel:
Du har provresultat i testet
tabell. Du måste tilldela varje resultat ett av följande textvärden:'dåligt resultat'
, 'genomsnittligt resultat'
, eller 'bra resultat'
. Dåliga resultat är de under 40, bra resultat är de över 70, och resten är genomsnittliga resultat.
provet
tabellen ser ut så här:
namn | resultat |
---|---|
Toby Shaw | 56 |
Casey Watson | 49 |
Bennie Lynn | 23 |
Lane Sloan | 70 |
Steff Fox | 85 |
Reggie Ward | 40 |
Gail Kennedy | 66 |
Brice Mueller | 90 |
Lösning 1:
SELECT name, result, CASE WHEN result < 40 THEN 'bad result' WHEN result > 70 THEN 'good result' ELSE 'average result' END AS category FROM exam;
Resultattabellen ser ut så här:
namn | resultat | kategori |
---|---|---|
Toby Shaw | 56 | genomsnittligt resultat |
Casey Watson | 49 | genomsnittligt resultat |
Bennie Lynn | 23 | dåligt resultat |
Lane Sloan | 70 | genomsnittligt resultat |
Steff Fox | 85 | bra resultat |
Reggie Ward | 40 | genomsnittligt resultat |
Gail Kennedy | 66 | genomsnittligt resultat |
Brice Mueller | 90 | bra resultat |
Diskussion:
För att visa ett värde baserat på dina specifika villkor måste du skriva en CASE
påstående. Syntaxen är:
CASE WHENTHEN , WHEN THEN , … ELSE END AS
Om condition_1
är uppfyllt, är det hämtade värdet value_1
. Om inte, kontrollerar databasen efter condition_2
. Om condition_2
är sant, är det hämtade värdet value_2
. Om inget av dessa villkor är uppfyllt, kontrollerar SQL efter de återstående villkoren en efter en tills ett av villkoren är uppfyllt. Om inget av villkoren är uppfyllt visas value_n
specificeras efter ELSE
hämtas.
ANELSE
del är valfri. Om du utelämnar det och inget av villkoren är uppfyllt får du en NULL
.
Kom ihåg att END
CASE
klausul när du är klar med alla villkor. Naturligtvis, som med alla kolumner du skapar, kan du byta namn på den (AS
I vårt exempel, 'dåligt resultat'
tilldelas när resultat <40 och 'bra resultat'
tilldelas när resultat> 70
. Om inget av dessa villkor är uppfyllt är värdet 'genomsnittligt resultat'
. För att namnge den nyskapade kolumnen med textvärdena måste du också använda ett alias (AS
kategori). Så här får du:
CASE WHEN result < 40 THEN 'bad result' WHEN result > 70 THEN 'good result' ELSE 'average result' END AS category
Eftersom 'genomsnittligt resultat'
tilldelas resultat mellan 40
och 70
(inklusive), kan du också skriva ett villkor istället för ELSE
(se Lösning 2 nedan). Det är dock lättare att använda ELSE
.
Lösning 2:
SELECT name, result, CASE WHEN result < 40 THEN 'bad result' WHEN result > 70 THEN 'good result' WHEN result >= 40 AND result <= 70 THEN 'average result' END AS category FROM exam;
Resultattabellen ser ut så här:
namn | resultat | kategori |
---|---|---|
Toby Shaw | 56 | genomsnittligt resultat |
Casey Watson | 49 | genomsnittligt resultat |
Bennie Lynn | 23 | dåligt resultat |
Lane Sloan | 70 | genomsnittligt resultat |
Steff Fox | 85 | bra resultat |
Reggie Ward | 40 | genomsnittligt resultat |
Gail Kennedy | 66 | genomsnittligt resultat |
Brice Mueller | 90 | bra resultat |
Diskussion:
Eftersom 'genomsnittligt resultat'
tilldelas resultat mellan 40
och 70
(inklusive), kan du skriva följande villkor istället för en ANSÅ
:
WHEN result >= 40 AND result <= 70 THEN 'average result'
Om du inte använder en ELSE
och vill inte ha någon NULL
s i kategorin
kolumnen måste du se till att du tar hand om alla möjliga resultat
värden. Om det finns ett resultat
som inte uppfyller något av villkoren får du en NULL
.
Lösning 3:
SELECT name, result, CASE WHEN result < 40 THEN 'bad result' WHEN result <= 70 THEN 'average result' ELSE 'good result' END AS category FROM exam;
Resultattabellen ser ut så här:
namn | resultat | kategori |
---|---|---|
Toby Shaw | 56 | genomsnittligt resultat |
Casey Watson | 49 | genomsnittligt resultat |
Bennie Lynn | 23 | dåligt resultat |
Lane Sloan | 70 | genomsnittligt resultat |
Steff Fox | 85 | bra resultat |
Reggie Ward | 40 | genomsnittligt resultat |
Gail Kennedy | 66 | genomsnittligt resultat |
Brice Mueller | 90 | bra resultat |
Diskussion:
De angivna villkoren i CASE
kan vara icke-överlappande som i de tidigare lösningarna eller överlappande som i denna lösning. Det första villkoret är detsamma som tidigare – för resultat <40
, kategorin
är 'dåligt resultat'
. Alla resultat under 40
tilldelas detta värde vid det här laget och du behöver inte göra något med dem längre. Det betyder att du inte behöver se till att resultat>=40
genom att ange villkoren för 'genomsnittligt resultat'
– alla resultat mindre än 40 har redan värdet 'dåligt resultat'
tilldelas. Slutligen, för de återstående resultaten ska kategorin vara 'bra resultat'
; ett enkelt ANS 'bra resultat'
tar hand om det. Så här får du:
CASE WHEN result < 40 THEN 'bad result' WHEN result <= 70 THEN 'average result' ELSE 'good result' END AS category
Obs:Ordningen på villkoren i CASE
frågor. Om du byter ordning på de två första villkoren (dvs. om du anger NÄR resultat <=70 DÅ 'genomsnittligt resultat'
först sedan NÄR resultat <=70 SEN 'medelresultat'
sekund), alla resultat mindre än eller lika med 70
hamnar i 'genomsnittligt resultat'
kategori, utan resultat tilldelade 'dåligt resultat'
kategori.