Problem:
Du vil bruge en CASE-sætning i SQL.
Eksempel:
Du har eksamensresultater i eksamen
bord. Du skal tildele hvert resultat til en af følgende tekstværdier:'dårligt resultat'
, 'gennemsnitligt resultat'
, eller 'godt resultat'
. Dårlige resultater er dem under 40, gode resultater er dem over 70, og resten er gennemsnitlige resultater.
eksamenen
tabellen ser sådan ud:
navn | 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 sådan ud:
navn | resultat | kategori |
---|---|---|
Toby Shaw | 56 | gennemsnitligt resultat |
Casey Watson | 49 | gennemsnitligt resultat |
Bennie Lynn | 23 | dårligt resultat |
Lane Sloan | 70 | gennemsnitligt resultat |
Steff Fox | 85 | godt resultat |
Reggie Ward | 40 | gennemsnitligt resultat |
Gail Kennedy | 66 | gennemsnitligt resultat |
Brice Mueller | 90 | godt resultat |
Diskussion:
For at vise en værdi baseret på dine specifikke forhold, skal du skrive en CASE
udmelding. Syntaksen er:
CASE WHENTHEN , WHEN THEN , … ELSE END AS
Hvis tilstand_1
er opfyldt, så er den hentede værdi value_1
. Hvis ikke, søger databasen efter condition_2
. Hvis tilstand_2
er sand, så er den hentede værdi value_2
. Hvis ingen af disse betingelser er opfyldt, kontrollerer SQL for de resterende betingelser en efter en i rækkefølge, indtil en af betingelserne er opfyldt. Hvis ingen af betingelserne er opfyldt, er value_n
angivet efter ELSE
er hentet.
ELSE
del er valgfri. Hvis du udelader det, og ingen af betingelserne er opfyldt, får du en NULL
.
Husk at END
CASE
klausul, når du er færdig med alle betingelserne. Som med enhver kolonne, du opretter, kan du selvfølgelig omdøbe den (AS
I vores eksempel, 'dårligt resultat'
tildeles når resultat <40 og 'godt resultat'
tildeles, når resultat> 70
. Hvis ingen af disse betingelser er opfyldt, er værdien 'gennemsnitligt resultat'
. For at navngive den nyoprettede kolonne med tekstværdierne skal du også bruge et alias (AS
kategori). Sådan får du:
CASE WHEN result < 40 THEN 'bad result' WHEN result > 70 THEN 'good result' ELSE 'average result' END AS category
Siden 'gennemsnitligt resultat'
er tildelt resultater mellem 40
og 70
(inklusive), kan du også skrive en betingelse i stedet for ELSE
(se Løsning 2 nedenfor). Det er dog nemmere at bruge 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 sådan ud:
navn | resultat | kategori |
---|---|---|
Toby Shaw | 56 | gennemsnitligt resultat |
Casey Watson | 49 | gennemsnitligt resultat |
Bennie Lynn | 23 | dårligt resultat |
Lane Sloan | 70 | gennemsnitligt resultat |
Steff Fox | 85 | godt resultat |
Reggie Ward | 40 | gennemsnitligt resultat |
Gail Kennedy | 66 | gennemsnitligt resultat |
Brice Mueller | 90 | godt resultat |
Diskussion:
Siden 'gennemsnitligt resultat'
er tildelt resultater mellem 40
og 70
(inklusive), kan du skrive følgende betingelse i stedet for en ELSE
:
WHEN result >= 40 AND result <= 70 THEN 'average result'
Hvis du ikke bruger en ELSE
og ønsker ikke nogen NULL
s i kategorien
kolonne, skal du sørge for at tage dig af alle mulige resultater
værdier. Hvis der er et resultat
der ikke opfylder nogen af betingelserne, 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 sådan ud:
navn | resultat | kategori |
---|---|---|
Toby Shaw | 56 | gennemsnitligt resultat |
Casey Watson | 49 | gennemsnitligt resultat |
Bennie Lynn | 23 | dårligt resultat |
Lane Sloan | 70 | gennemsnitligt resultat |
Steff Fox | 85 | godt resultat |
Reggie Ward | 40 | gennemsnitligt resultat |
Gail Kennedy | 66 | gennemsnitligt resultat |
Brice Mueller | 90 | godt resultat |
Diskussion:
De angivne betingelser i CASE
kan være ikke-overlappende som i de tidligere løsninger eller overlappende som i denne løsning. Den første betingelse er den samme som før – for resultat <40
, kategorien
er 'dårligt resultat'
. Alle resultater under 40
er tildelt denne værdi på dette tidspunkt, og du behøver ikke at gøre noget med dem længere. Det betyder, at der ikke er behov for at sikre, at result>=40
ved at specificere betingelserne for 'gennemsnitsresultat'
– alle resultater mindre end 40 har allerede værdien 'dårligt resultat'
tildelt. Endelig skal kategorien for de resterende resultater være 'godt resultat'
; et simpelt ELSE 'godt resultat'
tager sig af det. Sådan får du:
CASE WHEN result < 40 THEN 'bad result' WHEN result <= 70 THEN 'average result' ELSE 'good result' END AS category
Bemærk:Rækkefølgen af betingelserne i CASE
betyder noget. Hvis du vender om rækkefølgen af de to første betingelser (dvs. hvis du angiver NÅR resultat <=70 SÅ 'gennemsnitligt resultat'
først derefter HÅR resultat <=70 SÅ 'gennemsnitligt resultat'
sekund), alle resultater mindre end eller lig med 70
ende i 'gennemsnitligt resultat'
kategori, uden resultater tildelt 'dårligt resultat'
kategori.