sql >> Database >  >> RDS >> Database

Hoe schrijf je een CASE-instructie in SQL?

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
  WHEN  THEN ,
  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.


  1. Hoe de functie JulianDay() werkt in SQLite

  2. Select-instructie om ouder en oneindige kinderen te retourneren

  3. Beperking van externe sleutels kan cycli of meerdere cascadepaden veroorzaken?

  4. Partitiefunctie COUNT() OVER mogelijk met DISTINCT