OUJOOD.COM
En SQL, il arrive souvent qu'on veuille afficher un résultat différent selon la valeur d'une colonne — sans pour autant écrire plusieurs requêtes séparées. C'est exactement ce que fait l'expression CASE : elle évalue des conditions une par une, et retourne la valeur correspondant à la première condition vraie. Si aucune condition ne correspond, c'est la clause ELSE qui prend le relais (quand elle est présente).
On peut l'utiliser dans un SELECT pour créer une colonne calculée, dans un WHERE pour filtrer selon une logique conditionnelle, ou encore dans un GROUP BY et un HAVING pour des agrégations plus fines. C'est une des expressions les plus polyvalentes du langage SQL.
Syntaxe de SQL CASE
La structure de base se lit presque comme du français : "quand telle condition est vraie, retourne telle valeur, sinon retourne cette autre valeur".
CASE WHEN <condition> THEN <valeur_retournée> WHEN <autre_condition> THEN <autre_valeur> [ELSE <valeur_par_défaut>] END
- WHEN définit la condition à tester — n'importe quelle expression qui retourne vrai ou faux.
- THEN précise la valeur à retourner si la condition est vraie.
- ELSE est optionnel : il capture tous les cas qui n'ont correspondu à aucun WHEN. Sans ELSE, SQL retourne NULL par défaut.
- END ferme l'expression — il est obligatoire.
Les conditions sont évaluées dans l'ordre. Dès qu'une condition est vraie, SQL retourne la valeur associée et ignore les suivantes.
Exemples pratiques
Exemple 1 : classer des utilisateurs par tranche d'âge
On veut afficher une colonne status calculée à la volée, sans modifier la table. CASE évalue l'âge de chaque ligne et assigne la catégorie correspondante.
SELECT
id,
name,
age,
CASE
WHEN age < 18 THEN 'enfant'
WHEN age >= 18 AND age < 65 THEN 'adulte'
ELSE 'senior'
END AS status
FROM users;
La colonne status n'existe pas dans la table — elle est calculée à l'exécution. L'alias AS status lui donne un nom dans les résultats.
Exemple 2 : personnaliser un message d'accueil
On reprend la colonne status pour générer un message différent selon la catégorie. Ce type d'usage est courant dans les requêtes d'affichage ou de génération de rapports.
SELECT
id,
name,
status,
CASE
WHEN status = 'enfant' THEN 'Bienvenue, enfant !'
WHEN status = 'adulte' THEN 'Bienvenue, adulte !'
ELSE 'Bienvenue, senior !'
END AS message
FROM users;
Exemple 3 : appliquer un taux de TVA selon la catégorie produit
Ici, CASE sert à calculer un prix HT en appliquant un coefficient différent selon la catégorie. C'est un cas d'usage très fréquent dans les applications e-commerce ou de facturation.
SELECT
id,
name,
category,
CASE
WHEN category = 'livre' THEN price * 1.1
WHEN category = 'vêtement' THEN price * 1.2
ELSE price * 1.3
END AS price_with_tax
FROM products;
Exemple 4 : afficher le statut d'une commande en clair
Les bases de données stockent souvent des codes courts ('En attente', 'Envoyée'...). CASE permet de les convertir en libellés lisibles directement dans la requête, sans passer par la couche applicative.
SELECT
id,
CASE
WHEN statut = 'En attente' THEN 'Commande en attente de traitement'
WHEN statut = 'Envoyée' THEN 'Commande expédiée'
WHEN statut = 'Livrée' THEN 'Commande livrée au destinataire'
ELSE 'Statut inconnu'
END AS statut_lisible
FROM commandes;
Notez l'ajout d'un ELSE de sécurité : si un statut imprévu apparaît dans la table (suite à une migration ou une saisie manuelle), la requête retourne "Statut inconnu" plutôt que NULL.
Exemple pas à pas avec une vraie table
Pour bien ancrer les concepts, voici un exemple complet : on crée une table, on y insère des données, puis on exécute une requête CASE dessus.
Étape 1 : créer la table
CREATE TABLE users ( id INT NOT NULL AUTO_INCREMENT, name VARCHAR(255) NOT NULL, age INT NOT NULL, status VARCHAR(255) NOT NULL, PRIMARY KEY (id) );
Étape 2 : insérer des données de test
INSERT INTO users (name, age, status) VALUES
('John Doe', 25, 'adulte'),
('Jane Doe', 15, 'enfant'),
('Mary Smith', 65, 'senior');
Étape 3 : requête CASE sur la table
On interroge la table en calculant dynamiquement le statut à partir de l'âge — même si la colonne status existe déjà dans la table, CASE permet de vérifier ou recalculer cette valeur à la demande.
SELECT
id,
name,
age,
CASE
WHEN age < 18 THEN 'enfant'
WHEN age >= 18 AND age < 65 THEN 'adulte'
ELSE 'senior'
END AS status_calcule
FROM users;
Conseils d'utilisation
- Ajoutez toujours un ELSE explicite pour éviter les NULL silencieux — un résultat NULL non anticipé peut fausser des calculs ou des comparaisons plus loin dans votre code.
- Il est possible d'imbriquer des expressions CASE pour des conditions à plusieurs niveaux, mais lisez votre requête à voix haute après coup : si elle devient difficile à suivre, c'est souvent le signe qu'une vue ou une table de correspondance serait plus claire.
- CASE fonctionne aussi dans un ORDER BY — utile pour trier par priorité personnalisée plutôt qu'alphabétiquement.
Par carabde | Mis à jour le 16 mai 2026