Problème :
Vous souhaitez utiliser une instruction CASE en SQL.
Exemple :
Vous avez des résultats d'examen dans le exam
table. Vous devez attribuer à chaque résultat l'une des valeurs textuelles suivantes :'bad result'
, 'average result'
, ou 'good result'
. Les mauvais résultats sont ceux en dessous de 40, les bons résultats sont ceux au-dessus de 70 et les autres sont des résultats moyens.
L'exam
le tableau ressemble à ceci :
nom | résultat |
---|---|
Toby Shaw | 56 |
Casey Watson | 49 |
Bennie Lynn | 23 |
Lane Sloan | 70 |
Steff Fox | 85 |
Reggie Ward | 40 |
Gail Kennedy | 66 |
Brice Mueller | 90 |
Solution 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;
Le tableau de résultats ressemble à ceci :
nom | résultat | catégorie |
---|---|---|
Toby Shaw | 56 | résultat moyen |
Casey Watson | 49 | résultat moyen |
Bennie Lynn | 23 | mauvais résultat |
Lane Sloan | 70 | résultat moyen |
Steff Fox | 85 | bon résultat |
Reggie Ward | 40 | résultat moyen |
Gail Kennedy | 66 | résultat moyen |
Brice Mueller | 90 | bon résultat |
Discussion :
Pour afficher une valeur basée sur vos conditions spécifiques, vous devez écrire un CASE
déclaration. La syntaxe est :
CASE WHENTHEN , WHEN THEN , … ELSE END AS
Si condition_1
est remplie, alors la valeur récupérée est value_1
. Si ce n'est pas le cas, la base de données vérifie la condition_2
. Si condition_2
est vrai, alors la valeur récupérée est value_2
. Si aucune de ces conditions n'est remplie, SQL vérifie les conditions restantes une par une dans l'ordre jusqu'à ce qu'une des conditions soit remplie. Si aucune des conditions n'est remplie, la valeur value_n
spécifié après le ELSE
est récupéré.
Le ELSE
partie est facultative. Si vous l'omettez et qu'aucune des conditions n'est remplie, vous obtenez un NULL
.
N'oubliez pas de END
le CASE
clause lorsque vous avez terminé avec toutes les conditions. Bien sûr, comme pour toute colonne que vous créez, vous pouvez la renommer (AS <column_name>
).
Dans notre exemple, 'bad result'
est attribué lorsque result < 40, and 'good result'
est attribué lorsque result > 70
. Si aucune de ces conditions n'est remplie, la valeur est 'average result'
. De plus, pour nommer la colonne nouvellement créée des valeurs de texte, vous devez utiliser un alias (AS
Catégorie). Voici comment vous obtenez :
CASE WHEN result < 40 THEN 'bad result' WHEN result > 70 THEN 'good result' ELSE 'average result' END AS category
Depuis 'average result'
est attribué aux résultats entre 40
et 70
(inclus), vous pouvez également écrire une condition au lieu de ELSE
(voir solution 2 ci-dessous). Cependant, il est plus simple d'utiliser ELSE
.
Solution 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;
Le tableau de résultats ressemble à ceci :
nom | résultat | catégorie |
---|---|---|
Toby Shaw | 56 | résultat moyen |
Casey Watson | 49 | résultat moyen |
Bennie Lynn | 23 | mauvais résultat |
Lane Sloan | 70 | résultat moyen |
Steff Fox | 85 | bon résultat |
Reggie Ward | 40 | résultat moyen |
Gail Kennedy | 66 | résultat moyen |
Brice Mueller | 90 | bon résultat |
Discussion :
Depuis 'average result'
est attribué aux résultats entre 40
et 70
(inclus), vous pouvez écrire la condition suivante au lieu d'un ELSE
:
WHEN result >= 40 AND result <= 70 THEN 'average result'
Si vous n'utilisez pas de ELSE
et je ne veux pas de NULL
s dans la category
colonne, vous devez vous assurer de prendre soin de tous les result
possibles valeurs. S'il y a un result
qui ne remplit aucune des conditions, vous obtenez un NULL
.
Solution 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;
Le tableau de résultats ressemble à ceci :
nom | résultat | catégorie |
---|---|---|
Toby Shaw | 56 | résultat moyen |
Casey Watson | 49 | résultat moyen |
Bennie Lynn | 23 | mauvais résultat |
Lane Sloan | 70 | résultat moyen |
Steff Fox | 85 | bon résultat |
Reggie Ward | 40 | résultat moyen |
Gail Kennedy | 66 | résultat moyen |
Brice Mueller | 90 | bon résultat |
Discussion :
Les conditions spécifiées dans CASE
peuvent être non chevauchants comme dans les solutions précédentes ou chevauchants comme dans cette solution. La première condition est la même qu'avant - pour result < 40
, la category
est 'bad result'
. Tous les résultats inférieurs à 40
reçoivent cette valeur à ce stade et vous n'avez plus rien à faire avec eux. Cela signifie qu'il n'est pas nécessaire de s'assurer que result >= 40
en précisant les conditions du 'average result'
– tous les résultats inférieurs à 40 ont déjà la valeur 'bad result'
attribué. Enfin, pour les résultats restants, la catégorie doit être 'good result'
; un simple ELSE 'good result'
s'en occupe. Voici comment vous obtenez :
CASE WHEN result < 40 THEN 'bad result' WHEN result <= 70 THEN 'average result' ELSE 'good result' END AS category
Remarque :L'ordre des conditions dans CASE
questions. Si vous inversez l'ordre des deux premières conditions (c'est-à-dire si vous spécifiez WHEN result <= 70 THEN 'average result'
d'abord puis WHEN result <= 70 THEN 'average result'
seconde), tous les résultats inférieurs ou égaux à 70
se retrouver dans le 'average result'
catégorie, sans résultats attribués au 'bad result'
catégorie.