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.