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.