Database
 sql >> Base de données >  >> RDS >> Database

Comment écrire une instruction CASE en SQL

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