Probleem:
U wilt een CASE-instructie in SQL gebruiken.
Voorbeeld:
Je hebt examenresultaten in het exam
tafel. U moet elk resultaat toewijzen aan een van de volgende tekstwaarden:'bad result'
, 'average result'
, of 'good result'
. Slechte resultaten zijn die onder de 40, goede resultaten zijn die boven de 70 en de rest zijn gemiddelde resultaten.
Het exam
tabel ziet er als volgt uit:
naam | resultaat |
---|---|
Toby Shaw | 56 |
Casey Watson | 49 |
Bennie Lynn | 23 |
Lane Sloan | 70 |
Steff Fox | 85 |
Reggie Ward | 40 |
Gail Kennedy | 66 |
Brice Mueller | 90 |
Oplossing 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;
De resultatentabel ziet er als volgt uit:
naam | resultaat | categorie |
---|---|---|
Toby Shaw | 56 | gemiddeld resultaat |
Casey Watson | 49 | gemiddeld resultaat |
Bennie Lynn | 23 | slecht resultaat |
Lane Sloan | 70 | gemiddeld resultaat |
Steff Fox | 85 | goed resultaat |
Reggie Ward | 40 | gemiddeld resultaat |
Gail Kennedy | 66 | gemiddeld resultaat |
Brice Mueller | 90 | goed resultaat |
Discussie:
Om een waarde weer te geven op basis van uw specifieke conditie(s), moet u een CASE
. schrijven uitspraak. De syntaxis is:
CASE WHENTHEN , WHEN THEN , … ELSE END AS
Als condition_1
is voldaan, is de opgehaalde waarde value_1
. Zo niet, dan controleert de database op condition_2
. Als condition_2
waar is, dan is de opgehaalde waarde value_2
. Als aan geen van deze voorwaarden wordt voldaan, controleert SQL één voor één de overige voorwaarden totdat aan een van de voorwaarden is voldaan. Als aan geen van de voorwaarden is voldaan, wordt de value_n
gespecificeerd na de ELSE
wordt opgehaald.
De ELSE
deel is optioneel. Als je het weglaat en aan geen van de voorwaarden wordt voldaan, krijg je een NULL
.
Vergeet niet te END
de CASE
clausule wanneer u klaar bent met alle voorwaarden. Zoals bij elke kolom die u maakt, kunt u deze natuurlijk hernoemen (AS <column_name>
).
In ons voorbeeld 'bad result'
wordt toegewezen wanneer result < 40, and 'good result'
wordt toegewezen wanneer result > 70
. Als aan geen van deze voorwaarden wordt voldaan, is de waarde 'average result'
. Om de nieuw gemaakte kolom met tekstwaarden een naam te geven, moet u ook een alias gebruiken (AS
categorie). Zo krijg je:
CASE WHEN result < 40 THEN 'bad result' WHEN result > 70 THEN 'good result' ELSE 'average result' END AS category
Sinds 'average result'
wordt toegewezen aan resultaten tussen 40
en 70
(inclusief), je mag ook een voorwaarde schrijven in plaats van ELSE
(zie Oplossing 2 hieronder). Het is echter gemakkelijker om ELSE
. te gebruiken .
Oplossing 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;>
De resultatentabel ziet er als volgt uit:
naam | resultaat | categorie |
---|---|---|
Toby Shaw | 56 | gemiddeld resultaat |
Casey Watson | 49 | gemiddeld resultaat |
Bennie Lynn | 23 | slecht resultaat |
Lane Sloan | 70 | gemiddeld resultaat |
Steff Fox | 85 | goed resultaat |
Reggie Ward | 40 | gemiddeld resultaat |
Gail Kennedy | 66 | gemiddeld resultaat |
Brice Mueller | 90 | goed resultaat |
Discussie:
Sinds 'average result'
wordt toegewezen aan resultaten tussen 40
en 70
(inclusief), mag u de volgende voorwaarde schrijven in plaats van een ELSE
:
WHEN result >= 40 AND result <= 70 THEN 'average result'
Als u geen ELSE
. gebruikt en wil geen NULL
s in de category
kolom, moet u ervoor zorgen dat u zorgt voor alle mogelijke result
waarden. Als er een result
is die aan geen van de voorwaarden voldoet, krijgt u een NULL
.
Oplossing 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;
De resultatentabel ziet er als volgt uit:
naam | resultaat | categorie |
---|---|---|
Toby Shaw | 56 | gemiddeld resultaat |
Casey Watson | 49 | gemiddeld resultaat |
Bennie Lynn | 23 | slecht resultaat |
Lane Sloan | 70 | gemiddeld resultaat |
Steff Fox | 85 | goed resultaat |
Reggie Ward | 40 | gemiddeld resultaat |
Gail Kennedy | 66 | gemiddeld resultaat |
Brice Mueller | 90 | goed resultaat |
Discussie:
De gespecificeerde voorwaarden in CASE
kan niet-overlappend zijn zoals in de vorige oplossingen of overlappend zoals in deze oplossing. De eerste voorwaarde is hetzelfde als voorheen – voor result < 40
, de category
is 'bad result'
. Alle resultaten onder 40
krijgen op dit moment deze waarde toegewezen en u hoeft er niets meer mee te doen. Dit betekent dat het niet nodig is om ervoor te zorgen dat result >= 40
bij het specificeren van de voorwaarden voor het 'average result'
– alle resultaten onder de 40 hebben al de waarde 'bad result'
toegewezen. Tot slot, voor de overige resultaten moet de categorie 'good result'
. zijn; een eenvoudig ELSE 'good result'
zorgt ervoor. Zo krijg je:
CASE WHEN result < 40 THEN 'bad result' WHEN result <= 70 THEN 'average result' ELSE 'good result' END AS category
Opmerking:de volgorde van de voorwaarden in CASE
zaken. Als u de volgorde van de eerste twee voorwaarden omkeert (d.w.z. als u WHEN result <= 70 THEN 'average result'
opgeeft eerst dan WHEN result <= 70 THEN 'average result'
seconde), alle resultaten kleiner dan of gelijk aan 70
eindigen in het 'average result'
categorie, waarbij geen resultaten zijn toegewezen aan de 'bad result'
categorie.