Retour à la liste des articles Articles
10 minutes de lecture

Comment utiliser CASE en SQL

Si vous devez évaluer plusieurs instructions conditionnelles, l'instruction SQL CASE fera l'affaire. Voici ce que vous devez savoir pour utiliser CASE comme un pro.

Pourquoi le site CASE est-il si important en SQL ? Si vous analysez ou manipulez des données, vous voudrez souvent définir des règles basées sur certaines conditions, par exemple : si les performances d'un employé sont supérieures à la moyenne, accordez-lui une augmentation de 10 % ; si elles sont exceptionnelles, accordez-lui une augmentation de 15 % ; sinon, accordez-lui une augmentation de 5 %.

Pour gérer les situations où vous devez évaluer plusieurs déclarations conditionnelles ensemble et renvoyer des résultats en fonction de la déclaration qui est vraie, SQL propose l'instruction CASE.

L'instruction SQL CASE est l'une des constructions conditionnelles les plus utiles qui soient et a de nombreuses applications pour l'analyse des données avec SQL.

Si vous souhaitez découvrir les applications pratiques de l'instruction CASE et les différentes façons de l'utiliser, cet article est fait pour vous.

Qu'est-ce que l'instruction CASE ?

En SQL, l'instruction CASE renvoie des résultats basés sur l'évaluation de certaines conditions. Elle est assez polyvalente et peut être utilisée dans différentes constructions. Par exemple, vous pouvez l'utiliser pour afficher des valeurs, ordonner des résultats de tri ou filtrer des enregistrements. Elle évalue les conditions énoncées et renvoie le résultat de la première instruction qui est évaluée comme vraie.

Avant d'entrer dans les détails du fonctionnement de CASE, jetez un coup d'œil à la syntaxe de l'instruction CASE:

CASE
WHEN <condition> THEN <value>,
WHEN <other condition> THEN <value>
ELSE <value>
END AS <column name>

Examinons un exemple pratique d'une simple instruction CASE.

Voici la table order_summary tableau :

order_idcustomer_idcustomer_namequantityorder_valueshipping_fee
A1231221Emily52059
A1243213Javier223000
A1253213Javier12320000
A1263213Javier1016000

Imaginons que vous êtes analyste dans une entreprise de commerce électronique. Vous souhaitez analyser les commandes en fonction de leur valeur et les répartir en plusieurs catégories(très faible, faible, moyenne, élevée et très élevée) en fonction de leur valeur.

L'instruction CASE peut vous aider à y parvenir. Voici la requête que vous écrivez :

SELECT  order_id,
	  CASE 
	  WHEN order_value <= 50 THEN 'Very Low'
  WHEN order_value > 50 AND order_value <= 200 THEN 'Low'
  WHEN order_value > 200 AND order_value <= 500 THEN 'Medium'
  WHEN order_value > 500 AND order_value <= 1000 THEN 'High'
  ELSE 'Very High' 
  END AS order_category
FROM    order_summary;

Et voici les résultats que vous obtiendriez :

order_idorder_category
A123Medium
A124Medium
A125Very High
A126High

Alternativement, vous pouvez également utiliser la requête donnée ci-dessous :

SELECT order_id,
 CASE
 WHEN order_value <= 50 THEN 'Very Low'
 WHEN order_value <= 200 THEN 'Low'
 WHEN order_value <= 500 THEN 'Medium'
 WHEN order_value <= 1000 THEN 'High'
 ELSE 'Very High'
END AS order_category
FROM order_summary;

Vous obtiendrez exactement le même résultat, car CASE arrête d'évaluer une valeur dès qu'elle répond aux critères de WHEN.

Maintenant, laissez-moi décomposer ces requêtes.

Le premier mot-clé est SELECT, qui spécifie les colonnes que vous voulez retourner. Dans notre cas, ces colonnes sont order_id et order_category, que nous avons utilisées comme alias pour l'instruction CASE (CASE...END AS order_category).

L'instruction CASE commence par le mot-clé CASE. Il est suivi du mot-clé WHEN, après lequel nous spécifions une condition à évaluer (order_value <= 50). Elle est immédiatement suivie de THEN et de la valeur de retour si la condition est vraie (‘Very Low’).

Prenons l'exemple de la première instruction :

CASE WHEN order_value <= 50 THEN 'Very Low'

Dans cette instruction, lorsque la valeur de la commande est inférieure ou égale à 50 $, la colonne order_category renvoie la valeur "Very Low". En d'autres termes, nous classons toutes les commandes dont la valeur est inférieure ou égale à 50 $ dans la catégorie "Very Low".

Si cette condition n'est pas vraie (la valeur est supérieure à 50 $), la requête vérifie si la valeur est supérieure à 200 $. Si elle est inférieure à 200 $ mais supérieure à 50 $, la colonne order_category renvoie la valeur "Low". Si la valeur est supérieure à 200 $, la requête passe à la clause suivante WHEN, et ainsi de suite.

Si aucune des conditions n'est vraie, la valeur spécifiée dans ELSE est renvoyée. Ainsi, l'instruction CASE ajoute de la logique à votre instruction SELECT.

Si vous êtes novice en SQL et que vous souhaitez comprendre comment écrire ce type de requêtes, je vous recommande la pisteLe SQL de A à Z de LearnSQL.fr. Elle commence par les bases de SQL et des bases de données, puis vous guide jusqu'aux requêtes et fonctions plus sophistiquées. C'est un excellent moyen de commencer votre voyage en SQL.

Si vous analysez un grand nombre de commandes, l'agrégation peut s'avérer utile pour des requêtes comme celles-ci. L'agrégation consiste à regrouper des enregistrements similaires, puis à utiliser une métrique basée sur les valeurs groupées pour comprendre les caractéristiques de ce groupe. En SQL, la clause GROUP BY est votre entrée dans le monde des statistiques agrégées. (Pour une compréhension plus détaillée de GROUP BY, consultez cet article).

Pour l'instant, nous allons simplement voir comment GROUP BY et CASE fonctionnent ensemble. Voici une version mise à jour de notre requête précédente :

SELECT  CASE 
	  WHEN order_value <= 50 THEN 'Very Low'
  WHEN order_value > 50 AND order_value <= 200 THEN 'Low'
  WHEN order_value > 200 AND order_value <= 500 THEN 'Medium'
  WHEN order_value > 500 AND order_value <= 1000 THEN 'High'
  ELSE 'Very High' 
  END AS order_category,
  COUNT(order_id)
FROM    order_summary
GROUP BY 1;

Et le nouveau résultat :

order_categoryCOUNT(order_id)
High1
Medium2
Very High1

Ici, nous utilisons COUNT comme fonction d'agrégation. Voici comment cela fonctionne. La clause GROUP BY agrège tous les enregistrements en fonction des valeurs renvoyées dans la première colonne de SELECT. Dans notre cas, il s'agit de order_category.

Ensuite, pour chaque valeur différente de order_category, COUNT(order_id) calculera le nombre total de commandes appartenant à la catégorie correspondante. L'instruction CASE permet de décider de la catégorie à attribuer à chaque commande. Dans nos données, nous avons un total de 1 commande dans la catégorie "Haute" (order_value entre 500 et 1000), 2 commandes dans la catégorie "Moyenne" (order_value entre 200 et 500) et 1 commande dans la catégorie "Très haute" (order_value supérieure à 1000).

Dans tous les exemples ci-dessus, la clause CASE a été utilisée dans la partie SELECT de la requête. Cependant, cette clause est assez polyvalente et peut être utilisée pour renvoyer des résultats basés sur des conditions dans d'autres parties de la requête.

Maintenant que vous avez une idée de ce qu' est l 'instruction CASE, voyons d'autres façons de l'utiliser.

Utilisation de CASE dans la clause ORDER BY

La clause ORDER BY est utilisée pour trier les résultats d'une requête dans un ordre donné. Par exemple, vous pourriez vouloir trier le nombre de commandes passées par chaque client sur la base de customer_name. Voici la requête que vous écrivez :

SELECT   customer_name,
   COUNT(order_id)
FROM 	   order_summary
GROUP BY customer_name
ORDER BY customer_name;

Et la sortie est :

customer_nameCOUNT(order_id)
Emily1
Javier3

Ici, la requête trie les résultats dans l'ordre alphabétique croissant (parce que vous triez par une valeur texte). Sauf indication contraire de votre part, ORDER BY utilisera toujours l'ordre ascendant (c'est-à-dire A-Z, 1-10). Vous pouvez placer le mot clé DESC après la clause de nom de colonne pour trier les résultats dans l'ordre décroissant (Z-A, 10-1) : ORDER BY customer_name DESC.

Supposons que vous souhaitiez trier les enregistrements par order_id dans l'ordre croissant. Cependant, vous souhaitez afficher d'abord les commandes de plus de 120 éléments. En d'autres termes, vous allez d'abord trier par quantité d'articles (lorsque la quantité est supérieure à 120), puis par ID de commande. Cela nécessite une évaluation conditionnelle dans la clause ORDER BY:

Query:
SELECT
  customer_name,
  order_id,
  order_value,
  quantity
FROM
  order_summary
ORDER BY
  CASE WHEN quantity > 120 THEN quantity END, order_id;

Voici le résultat :

customer_nameorder_idorder_valuequantity
JavierA1252000123
EmilyA1232055
JavierA12430022
JavierA126600101

Dans cette requête, nous obtenons d'abord les colonnes customer_name, order_id, order_value et quantité de la table. En classant les lignes, cette requête obtient d'abord les lignes où la quantité est supérieure à 120. (Dans ce cas, la quantité est 123.) Comme aucune autre ligne ne répond à ce critère, le reste des lignes est classé par order_id.

Utilisation de CASE dans la clause WHERE

La clause WHERE est utilisée pour filtrer les enregistrements des résultats de la requête en fonction de conditions déclarées. Par exemple, si votre entreprise souhaite renoncer aux frais d'expédition pour les commandes supérieures à 100 $, vous voudrez peut-être d'abord voir combien de commandes rempliront les conditions requises et analyser l'impact. La clause suivante WHERE ne comptera que les ID des commandes supérieures à 100 $ :

SELECT  COUNT(order_id)
FROM    order_summary
WHERE   order_value > 100;

Et le résultat :

COUNT(order_id)
4

Sur la base du résultat, vous supposerez qu'environ 4 commandes seront impactées par cette mesure. Bien entendu, il s'agit de la première étape de votre analyse ; vous souhaiterez probablement effectuer des analyses beaucoup plus détaillées pour quantifier l'impact.

Laissez-moi maintenant vous montrer un exemple d'utilisation de la clause WHERE avec CASE. Jetez un coup d'œil à la influencer_list tableau :

influencer_nameinfluencer_channelyoutube_channelfb_channelmonth_yeartotal_views
LouisyoutubehungryLouisJan_20213200
JanetfacebookstylenmakeupJan_2021423444
MichaelfacebookInfl_brandXJan_20212322
MichaelfacebookInfl_brandXFeb_2021240000

Supposons que votre entreprise utilise divers influenceurs pour promouvoir vos marques. Vous voulez voir tous les influenceurs dont la chaîne YouTube ou le compte Facebook utilise directement votre nom ("BrandX").

Chaque influenceur possède un type de chaîne/compte. Voici comment vous trouverez ceux qui mentionnent BrandX :

SELECT DISTINCT influencer_name
FROM influencer_list
WHERE CASE WHEN influencer_channel = 'facebook' THEN fb_channel
	     WHEN influencer_channel = 'youtube' THEN youtube_channel
	     END LIKE '%brandX%';

Voici le résultat :

influencer_name
Michael

La requête ci-dessus renvoie toutes les lignes où youtube_channel ou fb_channel contient ‘brandX’. Comment pouvons-nous faire cela ? Eh bien, vous savez comment WHERE et CASE WHEN fonctionnent ensemble. Le nouvel élément ici est LIKE '%brandX%'. Il indique à la requête de renvoyer les canaux d'influence dont le nom contient "BrandX" ; LIKE est utilisé pour faire correspondre la valeur de la colonne au modèle, et le signe pourcentage (%) indique que n'importe quel nombre de caractères peut précéder ou suivre "BrandX" (c'est pourquoi le % se trouve aux deux extrémités de BrandX).

Utilisation de CASE dans la clause HAVING

La clause HAVING est utilisée avec la clause GROUP BY pour filtrer les groupes affichés. Par exemple, si vous souhaitez afficher les enregistrements de la table influencer_list pour lesquels total_views est supérieur à un million pendant la durée de vie de l'influenceur, vous écrivez :

SELECT      influencer_name,
	   SUM(total_views)
FROM     influencer_list
GROUP BY influencer_name
HAVING   SUM(total_views) > 200000;

Et voici ce que vous obtenez :

influencer_nameSUM(total_views)
Michael242322
Janet423444

Vous pouvez également utiliser CASE avec la clause HAVING. Supposons que vous vouliez obtenir une liste d'influenceurs dont le nombre total de vues est supérieur à 100 pour YouTube ou supérieur à 400 000 pour Facebook.

SELECT      influencer_name,
	   influencer_channel,
	   SUM(total_views)
FROM     influencer_list
GROUP BY influencer_name,
	   influencer_channel
HAVING   CASE WHEN influencer_channel = 'youtube' 
        THEN SUM(total_views) > 100
  WHEN influencer_channel = 'facebook' 
  THEN SUM(total_views) > 400000
   END;

Et le résultat :

influencer_nameinfluencer_channelSUM(total_views)
Louisyoutube3200
Janetfacebook423444

Cette requête additionne d'abord le nombre total de vues par influencer_name et influencer_channel. Dans la clause HAVING, nous filtrons ensuite uniquement les groupes qui ont plus de 100 vues pour YouTube et plus de 400 000 vues pour Facebook. Remarquez que Michael, qui a 242 322 vues sur Facebook, n'apparaît pas dans le résultat ; son total est inférieur à 400 000.

Utilisation de CASE dans une instruction UPDATE

Vous pouvez également utiliser CASE dans une instruction UPDATE. L'instruction SQL UPDATE est utilisée pour modifier les valeurs d'une table existante.

Imaginons que vous souhaitiez mettre à jour les valeurs de influencer_channel dans notre ensemble de données actuel en remplaçant les chaînes par un code à deux lettres : "youtube" doit être remplacé par "yt" et "facebook" par "fb".

UPDATE influencer_list
SET     influencer_channel = CASE influencer_channel 
 			  WHEN 'youtube' THEN 'yt'
			  WHEN 'facebook' THEN 'fb'
			  ELSE 'invalid value'
			  END;

Voici comment la table influencer_list après la mise à jour :

influencer_nameinfluencer_channelyoutube_channelfb_channelmonth_yeartotal_views
LouisythungryLouisJan_20213200
JanetfbstylenmakeupJan_2021423444
MichaelfbInfl_brandXJan_20212322
MichaelfbInfl_brandXFeb_2021240000

Vous remarquerez que "youtube" a été remplacé par "yt" et que "facebook" a été remplacé par "fb" dans la colonne "influencer_channel".

Vous pouvez également utiliser CASE pour supprimer ou insérer des lignes dans vos tableaux. Pour plus de détails, lisez cet article sur l'utilisation de CASE avec des instructions modifiant les données.

Prêt à utiliser CASE dans les requêtes SQL ?

Après tous ces exemples, je suis sûr que vous avez une meilleure idée du fonctionnement de CASE dans SQL et des diverses applications potentielles de l'instruction. Il est donc temps de mettre votre apprentissage en pratique ! La lecture de SQL vous aidera sûrement à apprendre, mais si vous voulez devenir un expert, votre mantra est "Pratiquez !

Je vous recommande également un bon cours pratique de SQL. Le cours pratique LearnSQL.fr utilise des exemples pratiques et des cas d'utilisation, et vous n'avez pas besoin d'installer quoi que ce soit pour commencer - l'Internet et un navigateur suffisent.

Plus vous écrirez de requêtes, plus vous maîtriserez CASE et les autres commandes SQL. Pourquoi attendre ? Commencez dès maintenant !