SQL Quest
Se connecter English 0 XP Niv. 1
Intermédiaire

SQL CASE WHEN : écrire des conditions dans une requête

5 min de lecture · 3 exemples exécutables · mis à jour le 9 octobre 2026

« Si le prix dépasse 100 €, afficher premium, sinon standard ». Pour ce type de logique, SQL propose l'expression CASE WHEN, l'équivalent du « si… alors… sinon » des langages de programmation. On peut l'utiliser partout où une valeur est attendue : dans le SELECT, le ORDER BY, et même à l'intérieur d'un SUM.

Syntaxe

CASE
  WHEN condition1 THEN valeur1
  WHEN condition2 THEN valeur2
  ELSE valeur_par_defaut
END

Comment ça marche

SQL teste les conditions WHEN dans l'ordre et renvoie la valeur de la première condition vraie. Si aucune n'est vraie, il renvoie la valeur du ELSE, ou NULL s'il n'y a pas de ELSE. Le mot END termine l'expression ; on lui donne souvent un alias avec AS.

Une forme raccourcie

Pour comparer une seule colonne à plusieurs valeurs : CASE statut WHEN 'livrée' THEN 'OK' WHEN 'annulée' THEN 'KO' ELSE '…' END.

Compter selon une condition

SUM(CASE WHEN condition THEN 1 ELSE 0 END) compte les lignes qui respectent une condition. Avec plusieurs expressions de ce type, on obtient un tableau croisé en une seule requête.

Schéma

produits
nomprix
Écran289
Plaid25
SSD149
résultat
nomgamme
Écranpremium
Plaidstandard
SSDpremium
CASE WHEN prix >= 100 THEN 'premium' ELSE 'standard' END : une nouvelle colonne est calculée selon une condition.

Schéma simplifié pour illustrer le principe. Les exemples ci-dessous utilisent la vraie base d'exercices de SQL Quest (une boutique en ligne fictive : voir le schéma complet).

Exemples avec leurs résultats

1. Créer des catégories

Une gamme de prix calculée pour chaque produit.

SELECT nom, prix,
  CASE
    WHEN prix >= 100 THEN 'premium'
    WHEN prix >= 30 THEN 'intermédiaire'
    ELSE 'petit prix'
  END AS gamme
FROM produits
ORDER BY prix DESC
LIMIT 8;
Essayer dans le bac à sable
Résultat
nomprixgamme
Écran 27"342premium
SSD 1To317premium
Souris sans fil103premium
Webcam HD101premium
Casque gaming98intermédiaire
Bougie parfumée60,92intermédiaire
Lampe LED51,74intermédiaire
Hub USB-C49intermédiaire

8 lignes au total

2. Regrouper sur une catégorie calculée

Le nombre de clients par tranche d'âge.

SELECT
  CASE
    WHEN age IS NULL THEN 'inconnu'
    WHEN age < 30 THEN 'moins de 30 ans'
    WHEN age < 50 THEN '30 à 49 ans'
    ELSE '50 ans et plus'
  END AS tranche,
  COUNT(*) AS nb
FROM clients
GROUP BY tranche
ORDER BY nb DESC;
Essayer dans le bac à sable
Résultat
tranchenb
50 ans et plus50
30 à 49 ans47
moins de 30 ans19
inconnu4

4 lignes au total

3. Compter selon une condition

Pour chaque année, le nombre total de commandes et le nombre de commandes annulées.

SELECT strftime('%Y', date_commande) AS annee,
       COUNT(*) AS total,
       SUM(CASE WHEN statut = 'annulée' THEN 1 ELSE 0 END) AS annulees
FROM commandes
GROUP BY annee;
Essayer dans le bac à sable
Résultat
anneetotalannulees
202319039
202421428
202519625

3 lignes au total

Les erreurs fréquentes

Oublier END

Chaque CASE doit se terminer par END, sinon la requête provoque une erreur de syntaxe.

À éviter
SELECT nom, CASE WHEN prix > 100 THEN 'cher' ELSE 'abordable' AS gamme FROM produits;
Correct
SELECT nom, CASE WHEN prix > 100 THEN 'cher' ELSE 'abordable' END AS gamme FROM produits;

Mettre les conditions dans le mauvais ordre

La première condition vraie gagne : ici, un prix de 300 € est classé « intermédiaire » car prix >= 30 est testé en premier.

À éviter
SELECT nom, CASE WHEN prix >= 30 THEN 'intermédiaire' WHEN prix >= 100 THEN 'premium' END FROM produits;
Correct
SELECT nom, CASE WHEN prix >= 100 THEN 'premium' WHEN prix >= 30 THEN 'intermédiaire' END FROM produits;

Oublier le ELSE

Sans ELSE, les lignes qui ne respectent aucune condition reçoivent NULL, ce qui fausse souvent les calculs.

À éviter
SELECT SUM(CASE WHEN statut = 'livrée' THEN 1 END) FROM commandes;
Correct
SELECT SUM(CASE WHEN statut = 'livrée' THEN 1 ELSE 0 END) FROM commandes;

Exercices

Essayez d'écrire la requête vous-même avant d'ouvrir la solution.

Défi 1. Affichez chaque produit avec une colonne « disponibilite » : « rupture » si le stock vaut 0, « faible » en dessous de 20, sinon « ok ».

Voir une solution
SELECT nom, stock, CASE WHEN stock = 0 THEN 'rupture' WHEN stock < 20 THEN 'faible' ELSE 'ok' END AS disponibilite FROM produits;
nomstockdisponibilite
Clavier mécanique105ok
Souris sans fil75ok
Écran 27"102ok
Webcam HD21ok
SSD 1To90ok
Casque gaming37ok
Hub USB-C162ok
Lampe LED15faible

29 lignes au total · 8 affichées

Essayer dans le bac à sable

Défi 2. Pour chaque ville, comptez les clients de moins de 30 ans et ceux de 30 ans et plus.

Voir une solution
SELECT ville, SUM(CASE WHEN age < 30 THEN 1 ELSE 0 END) AS jeunes, SUM(CASE WHEN age >= 30 THEN 1 ELSE 0 END) AS autres FROM clients GROUP BY ville;
villejeunesautres
Bordeaux49
Bruxelles08
Casablanca28
Genève05
Lille36
Lyon111
Marseille19
Montréal37

12 lignes au total · 8 affichées

Essayer dans le bac à sable
Envie de vous entraîner davantage ?

Les exercices interactifs sont corrigés automatiquement, avec un prof qui explique vos erreurs. Une leçon résumée reste affichée à côté de l'éditeur.

Faire les exercices interactifs

Questions fréquentes

Peut-on utiliser CASE dans un WHERE ?

Oui, mais c'est rarement nécessaire : une combinaison de AND et OR est en général plus simple à lire.

Existe-t-il une fonction IF en SQL ?

MySQL a IF(condition, a, b) et SQLite a IIF(condition, a, b) depuis la version 3.32. CASE WHEN est la version standard, valable partout.

Les valeurs de THEN doivent-elles être du même type ?

C'est fortement recommandé. Mélanger du texte et des nombres fonctionne en SQLite, mais provoque des erreurs ou des conversions dans d'autres bases.

À lire ensuite