Si tu connais déjà CASE, tu sais que c'est une façon d'intégrer de la logique directement dans ta requête. Mais tout le monde ne sait pas qu'il existe deux formes de CASE. Si CASE WHEN ... — c'est comme un if-else, alors le CASE simple — c'est comme un switch-case dans d'autres langages : il compare une expression à plusieurs valeurs et exécute le bloc correspondant.
Ça rend le code plus compact et intuitif quand tu compares un champ à des valeurs fixes.
Syntaxe du CASE simple
CASE expression
WHEN value1 THEN result1
WHEN value2 THEN result2
...
ELSE default_result
END
C'est tout bête :
expression— c'est l'expression ou le champ que tu compares àvalue1,value2, etc.THENindique quoi retourner si ça matche.ELSE— ce qui est retourné si rien ne matche (tu peux l'omettre, mais c'est pas conseillé).
Exemple : Notes des étudiants
Imaginons une table students avec une colonne grade contenant un entier de 2 à 5. On veut afficher l'interprétation textuelle des notes.
SELECT
name,
grade,
CASE grade
WHEN 5 THEN 'Excellent'
WHEN 4 THEN 'Bien'
WHEN 3 THEN 'Satisfaisant'
WHEN 2 THEN 'Insuffisant'
ELSE 'Inconnu'
END AS note_en_mots
FROM students;
Ici, CASE compare la valeur du champ grade avec les valeurs fixes 2, 3, 4, 5.
Exemple : Catégories de produits par code
Dans la table products il y a un champ category_code avec des petits codes : 'el', 'frn', 'bks' etc. On veut afficher un nom de catégorie lisible.
SELECT
product_name,
category_code,
CASE category_code
WHEN 'el' THEN 'Électronique'
WHEN 'frn' THEN 'Meubles'
WHEN 'bks' THEN 'Livres'
ELSE 'Autre'
END AS category_name
FROM products;
Cette astuce est super pratique quand tu veux afficher du texte "humain" à la place d'un code.
Exemple : Noms des mois
Parfois tu veux afficher le nom du mois en texte à partir du numéro :
SELECT
EXTRACT(MONTH FROM order_date) AS month_number,
CASE EXTRACT(MONTH FROM order_date)
WHEN 1 THEN 'Janvier'
WHEN 2 THEN 'Février'
WHEN 3 THEN 'Mars'
WHEN 4 THEN 'Avril'
WHEN 5 THEN 'Mai'
WHEN 6 THEN 'Juin'
WHEN 7 THEN 'Juillet'
WHEN 8 THEN 'Août'
WHEN 9 THEN 'Septembre'
WHEN 10 THEN 'Octobre'
WHEN 11 THEN 'Novembre'
WHEN 12 THEN 'Décembre'
ELSE 'Inconnu'
END AS month_name
FROM orders;
Ici, le CASE simple rend tout de suite plus clair ce qui serait sinon juste des chiffres de 1 à 12.
Travailler avec NULL dans le CASE simple
Faut bien piger que si tu compares une valeur à NULL, le résultat sera NULL, parce que NULL = NULL — c'est pas vrai, c'est inconnu.
Exemple avec NULL :
SELECT
user_id,
status,
CASE status
WHEN 'active' THEN 'Actif'
WHEN 'blocked' THEN 'Bloqué'
WHEN NULL THEN 'Pas de statut' -- ça marche pas !
ELSE 'Inconnu'
END AS etat_utilisateur
FROM users;
Au lieu de WHEN NULL, il vaut mieux utiliser ELSE, ou carrément passer au CASE de recherche (qu'on a vu dans le cours précédent) :
CASE
WHEN status IS NULL THEN 'Pas de statut'
...
Comparaison avec le CASE de recherche
| Caractéristique | CASE simple | CASE de recherche |
|---|---|---|
| Comparaison avec des valeurs précises | ✅ Pratique | ❌ Pas adapté |
| Souplesse des conditions (>, IS NULL) | ❌ Impossible | ✅ Possible |
| Équivalent en programmation | switch-case |
if-else |
Cas pratiques
Exemple : Visualisation du statut d'une demande
| request_id | status |
|---|---|
| 101 | new |
| 102 | in_progress |
| 103 | done |
| 104 | cancelled |
| 105 | NULL |
SELECT
request_id,
CASE status
WHEN 'new' THEN '🟡 Nouvelle'
WHEN 'in_progress' THEN '🔵 En cours'
WHEN 'done' THEN '🟢 Terminée'
ELSE '⚪ Inconnu'
END AS status_label
FROM requests;
| request_id | status_label |
|---|---|
| 101 | 🟡 Nouvelle |
| 102 | 🔵 En cours |
| 103 | 🟢 Terminée |
| 104 | ⚪ Inconnu |
| 105 | ⚪ Inconnu |
Ici, CASE fait office de traducteur : il transforme les statuts techniques en labels clairs (et même sympas). Et si le statut est inconnu ou NULL — l'utilisateur verra ⚪ « Inconnu ».
Exemple : Regroupement par catégories pour un rapport
| employee_id | name | department |
|---|---|---|
| 1 | Alex Lin | HR |
| 2 | Maria Chi | IT |
| 3 | Anna Song | IT |
| 4 | Otto Art | FIN |
| 5 | Jane Doe | HR |
| 6 | Max Gray | SALES |
| 7 | Zoe Black | IT |
| 8 | Tom Brown | FIN |
| 9 | Liam Park | NULL |
| 10 | Eva Gold | HR |
SELECT
CASE department
WHEN 'HR' THEN 'Ressources humaines'
WHEN 'IT' THEN 'Technologies'
WHEN 'FIN' THEN 'Finances'
ELSE 'Autre'
END AS dept_name,
COUNT(*) AS staff_count
FROM employees
GROUP BY
CASE department
WHEN 'HR' THEN 'Ressources humaines'
WHEN 'IT' THEN 'Technologies'
WHEN 'FIN' THEN 'Finances'
ELSE 'Autre'
END;
Résultat :
| dept_name | staff_count |
|---|---|
| Ressources humaines | 3 |
| Technologies | 3 |
| Finances | 2 |
| Autre | 2 |
Ce qui se passe ici :
- Les employés du département HR vont dans la catégorie Ressources humaines.
- IT — c'est Technologies.
- FIN — c'est Finances.
- Tout le reste, y compris SALES et NULL, va dans Autre. Cette approche est top pour faire des rapports clairs et sympas.
Erreurs fréquentes
- Oublié
ELSE→ tu obtiensNULLsi aucune valeur ne matche. - Tu compares à
NULL→ ça marche pas, utiliseIS NULLet leCASEde recherche. - Tu compares des types incompatibles → par exemple,
CASE grade WHEN '5'alors quegradeest un type numérique.
Le CASE simple — c'est ton outil quand tu veux comparer une valeur à une liste de possibilités. Il est compact, lisible et super utile pour la classification texte, la visualisation, la conversion de codes et le regroupement pratique.
Mais si tu dois vérifier des intervalles, des NULL, ou des conditions plus complexes — prends le CASE de recherche. SQL aime la clarté. Et CASE — c'est ton outil pour donner forme à cette clarté.
GO TO FULL VERSION