CodeGym /Cours /SQL SELF /Expressions conditionnelles : CASE <expression&...

Expressions conditionnelles : CASE <expression> WHEN ... THEN ... ELSE ... END

SQL SELF
Niveau 10 , Leçon 1
Disponible

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.
  • THEN indique 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 obtiens NULL si aucune valeur ne matche.
  • Tu compares à NULL → ça marche pas, utilise IS NULL et le CASE de recherche.
  • Tu compares des types incompatibles → par exemple, CASE grade WHEN '5' alors que grade est 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é.

Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION