Retour à la liste des articles Articles
10 minutes de lecture

Qu'est-ce que CASE en SQL ?

Le CASE SQL est une expression très utile qui fournit une logique if-else à vos requêtes SQL. Il s'agit d'un sujet un peu plus avancé, mais vous en aurez besoin lors de la préparation de rapports - il apportera une valeur ajoutée considérable à vos projets personnels et professionnels.

L'instruction SQL CASE est un outil de flux de contrôle qui vous permet d'ajouter une logique if-else à une requête. En règle générale, vous pouvez utiliser l'instruction CASE partout où une expression valide est autorisée, par exemple avec les clauses SELECT, WHERE et GROUP BY.

L'expression CASE parcourt chaque condition et renvoie une valeur lorsque la première condition est remplie. Lorsqu'une condition est vraie, CASE renvoie le résultat indiqué. Si aucune condition n'est vraie, elle renvoie la valeur de la clause ELSE. S'il n'y a pas de ELSE et qu'aucune condition n'est vraie, elle renvoie NULL.

Exemple simple de CASE SQL

Voici la syntaxe de l'expression SQL CASE:

CASE 
  		WHEN condition_1 THEN result_1
   		WHEN condition_2 THEN result_2
   		ELSE else_result
END 

Dans cette syntaxe, SQL CASE fait correspondre la valeur avec condition_1 ou condition_2. Si une correspondance est trouvée, l'instruction renvoie le résultat correspondant (result_1 si la valeur correspond à condition_1 ou result_2 si elle correspond à condition_2). Si la valeur ne correspond à aucune des deux conditions, else_result est renvoyé. L'instruction ELSE est facultative et permet de capturer des valeurs non spécifiées dans les instructions WHEN..THEN. Enfin, chaque instruction CASE doit se terminer par le mot-clé END.

Le type de données du résultat de l'instruction SQL CASE dépend du contexte dans lequel il est utilisé. Par exemple, si l'expression CASE est utilisée avec des chaînes CHAR, elle renvoie le résultat sous la forme d'une chaîne CHAR. Si l'expression CASE est utilisée dans un contexte numérique, elle renvoie le résultat sous la forme d'un nombre entier, d'une décimale ou d'une valeur réelle. La maîtrise de ce puissant outil de flux de contrôle offre de nombreuses possibilités de récupérer et d'afficher des données de manière créative, comme le montre cet article sur l'ajout de logique à votre requête SQL avec CASE.

Appliquons la déclaration SQL CASE à un exemple pratique. Imaginons que nous ayons une petite épicerie et que nous utilisions une simple table de base de données pour suivre nos stocks. La table stock contient l'article, le prix de l'article et la quantité de cet article actuellement en stock.

ItemPriceQuantity
Bread1.5923
Milk2.003
Coffee3.2987
Sugar0.790
Eggs2.2053
Apples1.9917

Et si nous voulions une simple description pour accompagner nos données et fournir plus de contexte à nos rapports ? C'est facile à réaliser avec CASE WHEN:

SELECT Item, Price,
       CASE 
   WHEN Price < 1.00 THEN 'Below $1.00'
	   WHEN Price >= 1.00 THEN 'Greater or Equal to $1.00'
       END AS 'Price Description'
  FROM stock

D'abord, notre SELECT indique que nous voulons récupérer les données de nos colonnes Item et Price. Vient ensuite notre déclaration CASE. Lorsque Price est inférieur à 1,00, nous renvoyons la chaîne 'Below $1.00'. Lorsque Price est supérieur ou égal à 1,00, nous voulons renvoyer la chaîne "Supérieur ou égal à 1,00". Ceci est appliqué à chaque valeur de Price dans notre tableau.

Nous précisons également que les valeurs renvoyées par l'instruction CASE WHEN doivent figurer dans une colonne appelée Description des prix:

ItemPricePrice Description
Brea1.59Greater or Equal to $1.00
Milk2.00Greater or Equal to $1.00
Coffee3.29Greater or Equal to $1.00
Sugar0.79Below $1.00
Eggs2.20Greater or Equal to $1.00
Apples1.99Greater or Equal to $1.00

Et voilà ! Pour chaque ligne où Price est inférieur à 1,00, la chaîne "Below $1.00" est renvoyée. Pour les valeurs de Price supérieures ou égales à 1,00, la chaîne "Supérieur ou égal à 1,00 $" est renvoyée. Les résultats sont affichés dans la colonne Description du prix.

SQL CASE WHEN avec ELSE

Si vous utilisez ELSE, cette instruction doit venir après chaque condition CASE WHEN que vous avez spécifiée. Supposons maintenant que nous voulions classer les différents prix de notre tableau en 3 catégories différentes :

  • Les articles dont le prix est inférieur à 1,00 $.
  • Articles entre 1,00 et 3,00 $.
  • Articles supérieurs à 3 $.

Nous utiliserons l'instruction ELSE pour traiter les valeurs Price supérieures à 3,00 :

SELECT Item, Price,
       CASE WHEN Price < 1.00 THEN 'Below $1.00'
	   WHEN Price >= 1.00 AND Price <= 3.00 THEN 'Between $1.00 and $3.00'
	   ELSE 'Above $3.00' 
       END AS 'Price Description'
  FROM stock

L'adresse Price de chaque ligne est vérifiée pour voir si elle est égale ou inférieure à 1,00 ou comprise entre 1,00 et 3,00. S'il appartient à l'une de ces catégories, la chaîne correspondante est renvoyée. Si Price n'est pas inférieur à 3,00, l'instruction ELSE est atteinte. Notre instruction ELSE renvoie la chaîne de caractères "Supérieure à 3,00 $".

C'est pourquoi l'ordre de vos instructions est important. SQL évalue chaque CASE dans l'ordre, pour finalement atteindre la ELSE si aucune condition n'a été remplie.

ItemPricePrice Description
Bread1.59Between $1.00 and $3.00
Milk2.00Between $1.00 and $3.00
Coffee3.29Above $3.00
Sugar0.79Below $1.00
Eggs2.20Between $1.00 and $3.00
Apples1.99Between $1.00 and $3.00

Utilisation de plusieurs CAS

La principale raison pour laquelle une personne peut choisir d'utiliser l'instruction SQL CASE est qu'elle souhaite évaluer plusieurs conditions. Il veut effectuer une série de contrôles et transformer les résultats en données significatives, généralement sous la forme d'un rapport.

Disons que nous voulons générer un rapport simple pour notre table stock table. Il nous dira si le niveau de stock est élevé, moyen, faible ou carrément épuisé ! Ceci peut être facilement réalisé en utilisant CASE:

SELECT Item,
      CASE WHEN Quantity > 0 AND Quantity <= 20 THEN 'Low'
            WHEN Quantity > 20 AND Quantity <= 50 THEN 'Medium'
            WHEN Quantity > 50 THEN 'High'
            ELSE 'Out Of Stock' 
		END AS 'Stock Level'
  	FROM stock

Il s'agit de notre exemple le plus complexe jusqu'à présent. Décomposons cette requête SQL.

Notre résultat aura deux colonnes. La première colonne est Item, avec laquelle nous effectuons une sélection explicite :

SELECT Item

La deuxième colonne est la colonne de résultats générée par nos expressions SQL CASE WHEN, que nous appelons Stock Level:

END AS 'Stock Level'

Décomposons maintenant chaque condition, dans l'ordre où SQL les évalue.

Tout d'abord, SQL vérifie si le site Quantity est supérieur à zéro et inférieur ou égal à 20.

	CASE WHEN Quantity > 0 AND Quantity <= 20 THEN 'Low'

Si c'est le cas, il renvoie "Low" et la ligne suivante commence à être évaluée.

Si le résultat est faux, l'évaluateur examine l'instruction suivante CASE:

WHEN Quantity > 20 AND Quantity <= 50 THEN 'Medium'

Quantity est à nouveau vérifiée pour voir si la valeur est supérieure à 20 et inférieure ou égale à 50, et renvoie la chaîne 'Medium' si c'est le cas. Si cette condition n'est pas remplie, la condition suivante est vérifiée :

WHEN Quantity > 50 THEN 'High'

La dernière instruction CASE vérifie si la valeur de Quantity est supérieure à 50, et renvoie la chaîne "High" si c'est le cas.

Il existe une autre situation non couverte par nos différentes instructions CASE. Que se passe-t-il si la valeur Quantity d'un certain Item est égale à 0 ? Regardez à nouveau nos instructions CASE, en particulier :

		CASE WHEN Quantity > 0 AND Quantity <= 20 THEN 'Low'
		

Nous vérifions que Quantity est supérieur à 0, ce qui signifie que s'il est égal à 0, cette condition sera évaluée comme fausse et la base de données continuera à vérifier les autres déclarations CASE. C'est pour cette raison que nous avons inclus l'instruction ELSE dans notre requête SQL :

ELSE 'Out Of Stock' 

Cela permet de répondre à ce scénario exact. Si la valeur de Quantity d'un Item est 0, l'évaluateur SQL atteindra notre instruction ELSE et renverra "Out of Stock".

L'exécution de cette requête donne le résultat suivant :

ItemStock Level
BreadMedium
MilkLow
CoffeeHigh
SugarOut Of Stock
EggsHigh
ApplesLow

Nous pouvons voir que le sucre a une valeur de 0 sur Quantity, ce qui signifie qu'il est affiché comme "Out of Stock". Comparez les autres valeurs de Quantity dans notre stock avec le Stock Level indiqué pour vous assurer que vous comprenez le fonctionnement de nos instructions CASE.

Imaginez l'utilité de ce rapport s'il y avait des centaines d'articles. Un rapport de ce type pourrait être envoyé quotidiennement aux responsables des achats, ce qui leur permettrait de maintenir les niveaux de stock des articles populaires.

CASE avec des valeurs NULL

Lorsque vous utilisez CASE, vous pouvez remarquer des valeurs NULL indésirables dans votre ensemble de résultats. Pourquoi ces valeurs apparaissent-elles et quelles actions pouvez-vous entreprendre pour les supprimer ? Les valeurs NULL apparaissent lorsqu'une valeur ne correspond à aucune des déclarations de CASE ou ELSE que vous déclarez. Prenons un exemple pratique qui montre comment NULL peut être renvoyé.

Imaginons que nous ayons exclu la déclaration ELSE de notre exemple précédent. Quel impact cela aurait-il sur nos résultats ? Reprenons la requête précédente, cette fois sans l'instruction ELSE:

SELECT Item,
      CASE WHEN Quantity > 0 AND Quantity <= 20 THEN 'Low'
            WHEN Quantity > 20 AND Quantity <= 50 THEN 'Medium'
            WHEN Quantity > 50 THEN 'High'
		END AS 'Stock Level'
  	FROM stock

Les résultats ressembleraient à ceci. Portez une attention particulière au niveau de stock du sucre :

ItemStock Level
BreadMedium
MilkLow
CoffeeHigh
SugarNULL
EggsHigh
ApplesLow

Sans ELSE pour gérer le cas où Quantity serait égal à zéro, notre requête renvoie un NULL.

Si vous avez une valeur NULL non désirée dans vos résultats CASE WHEN, il se peut que vous ayez un scénario qui n'est pas couvert par vos conditions CASE WHEN et ELSE.

GROUP BY avec CASE

Comme indiqué précédemment, vous pouvez utiliser l'expression SQL CASE avec GROUP BY. Examinons un exemple pratique.

Imaginons que nous voulions regrouper des articles en fonction de leur prix tout en affichant également le prix minimum et maximum pour les groupes à faible coût et à coût élevé. Cela nécessite l'utilisation des fonctions d'agrégation MIN() et MAX(). L'instruction GROUP BY est souvent utilisée pour regrouper des données résultantes par une ou plusieurs colonnes, et souvent spécifiquement avec les fonctions d'agrégation. Voici un exemple d' utilisation de GROUP BY avec les fonctions d'agrégation que vous pouvez lire pour plus d'informations. Décomposons la requête SQL ci-dessous pour montrer comment nous pouvons obtenir l'ensemble de résultats souhaité :

SELECT
CASE WHEN Price >= 2.00 THEN 'High Price Item'
WHEN Price > 0 AND Price < 2.00 THEN 'Low Price Item'
END AS PriceLevel,
Min(Price) as MinimumPrice,
Max(Price) as MaximumPrice

FROM stock
GROUP BY
CASE WHEN Price >= 2.00 THEN 'High Price Item'
WHEN Price > 0 AND Price < 2.00 THEN 'Low Price Item'

END

Tout d'abord, analysons l'instruction CASE. Elle est similaire à l'exemple précédent.

CASE WHEN Price >= 2.00 THEN 'High Price Item'
WHEN Price > 0 AND Price < 2.00 THEN 'Low Price Item'
END AS PriceLevel

Si Price est supérieur ou égal à 2,00, l'article est classé comme un article à prix élevé. Si Price est supérieur à 0 mais inférieur à 2,00, l'article est un article à bas prix. Ces valeurs de chaîne sont ensuite stockées et affichées dans la colonne PriceLevel, comme spécifié par l'alias END AS.

Nous utilisons les fonctions d'agrégation MIN() et MAX() sur notre colonne Price. Nous obtenons ainsi la valeur la plus basse et la plus haute de Price des éléments de notre table.

Nous utilisons notre clause GROUP BY pour appliquer ces fonctions d'agrégation à nos deux catégories de niveaux de prix élevés et bas. (Ne vous inquiétez pas si cela vous semble compliqué ; la maîtrise de GROUP BY demande beaucoup de pratique. Consultez notre pisteLa pratique du SQL pour des exercices interactifs qui affinent votre technique GROUP BY et d'autres compétences SQL).

L'exécution de cette requête SQL renvoie l'ensemble de résultats suivant :

PriceLevelMinimumPriceMaximumPrice
High Price Item2.003.29
Low Price Item0.791.99

Ce sont exactement les résultats que nous voulions ! Nous pouvons maintenant voir clairement le prix minimum et maximum de chacune des catégories d'articles définies dans notre instruction SQL CASE WHEN. Reportez-vous à notre tableau stock et notez quels articles individuels sont liés aux valeurs indiquées pour MinimumPrice et MaximumPrice. Si nous devions ajouter un nouvel article à notre table stock qui coûte 4,00 $, vous verriez que le site MaximumPrice de l'"article à prix élevé" passe à 4,00.

SQL CASE et les requêtes complexes réutilisables

L'utilisation de SQL CASE vous permettra d'écrire des requêtes complexes qui effectuent une série d'actions. Nous venons de vous montrer comment utiliser CASE WHEN avec SELECT. Comme le montre cet article sur l'utilisation du CASE avec les instructions de modification des données, CASE WHEN peut également être utilisé avec INSERT, UPDATE et DELETE. Il en résulte des requêtes hautement réutilisables qui peuvent être mises en œuvre dans des rapports ou des applications. Si vous souhaitez apprendre à créer des rapports personnalisés de grande valeur, je vous recommande le cours complet sur la création de rapports SQL, disponible sur LearnSQL.fr.