COALESCE & CASE
CASE introduit une logique « si… alors… sinon » dans une requête, COALESCE renvoie la première valeur non NULL. Ils servent à classer des lignes en catégories ou à remplacer une valeur manquante.
- conditionnel
- NULL
- if
- NULLIF
- IIF
- IFNULL
Syntaxe
COALESCE(valeur1, valeur2, defaut)CASE WHEN condition1 THEN resultat1 WHEN condition2 THEN resultat2 ELSE resultat_par_defautENDExemple
SELECT c.name AS classe, COALESCE(t.name, 'À pourvoir') AS professeur, CASE WHEN t.subject IS NULL THEN 'Non défini' WHEN t.subject = 'Mathématiques' THEN 'Sciences' ELSE 'Lettres' END AS poleFROM classes cLEFT JOIN teachers t ON t.id = c.teacher_idORDER BY c.id;-- Jeu de données : école-- Résultat attendu :-- 6ème A | Marie Dupont | Sciences-- 6ème B | Jean Martin | Lettres-- 5ème A | Sophie Bernard | Lettres-- 4ème A | À pourvoir | Non définiÀ retenir
- CASE teste les conditions dans l'ordre et s'arrête à la première vraie. Sans ELSE, une ligne qui ne vérifie aucune condition reçoit NULL.
- NULLIF(a, b) renvoie NULL si a = b : total / NULLIF(nb, 0) évite une division par zéro.
- Piège : la forme simple CASE col WHEN NULL THEN … ne fonctionne jamais, car elle teste col = NULL. Utilisez CASE WHEN col IS NULL THEN …
- Équivalents à deux arguments : IFNULL(a, b) dans SQLite et MySQL, ISNULL(a, b) dans SQL Server. COALESCE, standard et sans limite d'arguments, est à préférer.
Voir aussi
- IS NULL / IS NOT NULLNULL signifie « valeur inconnue » et ne se compare pas avec =. IS NULL et IS NOT NULL sont les seuls tests fiables pour trouver une donnée manquante, comme une classe sans professeur.
- Agrégation conditionnellePlacer un CASE dans un agrégat permet de calculer plusieurs indicateurs en un seul passage, un par colonne. C'est la technique du tableau croisé : une ligne par client, une colonne par statut.
- WHEREWHERE ne garde que les lignes qui vérifient une condition, avant tout regroupement. C'est le filtre de base pour cibler un client, une période, un statut ou une plage de valeurs.
- FULL OUTER JOINFULL OUTER JOIN garde toutes les lignes des deux tables, appariées quand c'est possible et complétées par NULL sinon. C'est l'outil du rapprochement entre deux listes ou deux périodes.