Les valeurs nulles sont l'une des sources d'erreurs les plus fréquentes en SQL. COALESCE et NULLIF sont deux fonctions conçues spécifiquement pour les maîtriser, et elles reviennent régulièrement dans les entretiens techniques data. Savoir les utiliser correctement, c'est démontrer une vraie maîtrise du langage au-delà des requêtes basiques.
COALESCE retourne la première valeur non nulle d'une liste d'expressions. NULLIF fait l'inverse : elle transforme une valeur spécifique en NULL si deux expressions sont égales. Ces 2 fonctions se complètent parfaitement pour écrire du code SQL robuste et lisible.
Dans ce guide, vous allez comprendre la syntaxe exacte, les cas d'usage concrets, les pièges classiques, et comment ces fonctions sont évaluées en entretien technique.
📌 Ce qu'il faut retenir
COALESCE(a, b, c)retourne la 1re valeur non nulle parmi a, b, cNULLIF(x, y)retourneNULLsi x = y, sinon retourne x- Ces fonctions sont disponibles dans PostgreSQL, MySQL, SQL Server et BigQuery
- Les combiner évite les erreurs de division par zéro et les données manquantes en affichage
Comprendre COALESCE : syntaxe et logique
COALESCE accepte un nombre variable d'arguments et les évalue de gauche à droite. Dès qu'elle rencontre une valeur non nulle, elle s'arrête et retourne cette valeur. Si tous les arguments sont nuls, elle retourne NULL.
SELECT COALESCE(NULL, NULL, 'valeur_par_défaut');
-- Résultat : 'valeur_par_défaut'
C'est fonctionnellement équivalent à une expression CASE WHEN, mais bien plus concise. La plupart des moteurs SQL optimisent COALESCE de façon identique à un CASE WHEN col IS NOT NULL THEN col ELSE ....
Remplacer une valeur nulle par un défaut
Le cas d'usage le plus courant : afficher une valeur de remplacement quand une colonne est nulle.
SELECT
user_id,
COALESCE(first_name, 'Inconnu') AS prenom_affiché
FROM users;
Cette requête garantit qu'aucune ligne n'affichera NULL dans la colonne prenom_affiché. C'est particulièrement utile avant d'exporter des données vers un dashboard ou un rapport.
Fusionner plusieurs colonnes sources
COALESCE excelle quand vous avez plusieurs colonnes alternatives pour une même information — par exemple un téléphone mobile, un téléphone fixe, puis un numéro de contact d'urgence.
SELECT
customer_id,
COALESCE(phone_mobile, phone_home, phone_emergency, 'Aucun contact') AS contact
FROM customers;
SQL évalue les colonnes dans l'ordre donné et retourne la première valeur disponible. Ce pattern évite d'écrire des CASE WHEN imbriqués et rend l'intention du code immédiatement lisible.
💡 Bon à savoir
En PostgreSQL, COALESCE est évaluée en court-circuit : dès qu'une valeur non nulle est trouvée, les arguments suivants ne sont pas évalués. Cela peut avoir un impact sur les performances si les arguments sont des sous-requêtes coûteuses.
Comprendre NULLIF : syntaxe et logique
NULLIF(expression1, expression2) retourne NULL si les deux expressions sont égales, sinon retourne expression1. C'est l'opération inverse de COALESCE : au lieu de remplacer un NULL, on en crée un à partir d'une valeur indésirable.
SELECT NULLIF(10, 10); -- Résultat : NULL
SELECT NULLIF(10, 5); -- Résultat : 10
Éviter les divisions par zéro
Le cas d'usage classique en entretien : NULLIF protège contre les erreurs de division par zéro. Diviser par NULL retourne NULL plutôt que de lever une erreur.
SELECT
revenue,
clicks,
revenue / NULLIF(clicks, 0) AS revenue_per_click
FROM campaigns;
Sans NULLIF, une ligne avec clicks = 0 provoquerait une erreur arithmétique. Avec NULLIF(clicks, 0), le dénominateur devient NULL et le résultat de la division aussi — ce qui est gérable en aval.
Nettoyer des valeurs sentinelles
Les bases de données héritées (legacy) stockent parfois des valeurs sentinelles à la place de NULL : 'N/A', '0', '-1', 'unknown'. NULLIF permet de les normaliser.
SELECT
product_id,
NULLIF(description, 'N/A') AS description_clean,
NULLIF(price, -1) AS price_clean
FROM products_legacy;
Après cette transformation, vous pouvez utiliser IS NULL et IS NOT NULL de façon fiable pour filtrer les vraies valeurs manquantes.
Combiner COALESCE et NULLIF
L'association des 2 fonctions est particulièrement puissante. Un pattern récurrent : on utilise NULLIF pour neutraliser une valeur indésirable, puis COALESCE pour la remplacer par un défaut.
SELECT
employee_id,
COALESCE(NULLIF(department, 'Unassigned'), 'Non défini') AS dept_label
FROM employees;
Cette requête traite 'Unassigned' exactement comme un NULL — elle le remplace par 'Non défini'. C'est plus lisible qu'un CASE WHEN department = 'Unassigned' OR department IS NULL THEN ....
Calcul de taux avec protection intégrée
Voici un exemple complet qui combine les 2 fonctions pour calculer un taux de conversion :
SELECT
campaign_id,
impressions,
conversions,
ROUND(
COALESCE(conversions, 0) * 100.0
/ NULLIF(impressions, 0),
2
) AS conversion_rate_pct
FROM campaigns;
COALESCE(conversions, 0): traite les conversions nulles comme 0NULLIF(impressions, 0): évite la division par zéro- Le résultat est propre et exploitable directement dans un rapport
Pour aller plus loin sur les calculs analytiques, consultez notre article sur les fonctions fenêtre SQL qui utilisent des patterns similaires.
Comparatif avec les alternatives SQL
| Fonction / Syntaxe | Rôle principal | Compatibilité | Lisibilité |
|---|---|---|---|
COALESCE(a, b) |
Retourne la 1re valeur non nulle | Standard SQL (tous moteurs) | Excellente |
NULLIF(x, y) |
Convertit une valeur en NULL | Standard SQL (tous moteurs) | Bonne |
ISNULL(x, y) |
Remplace NULL par y (2 args) | SQL Server uniquement | Bonne |
IFNULL(x, y) |
Remplace NULL par y (2 args) | MySQL / SQLite uniquement | Bonne |
NVL(x, y) |
Remplace NULL par y (2 args) | Oracle uniquement | Bonne |
CASE WHEN x IS NULL THEN y ELSE x END |
Équivalent à COALESCE | Tous moteurs | Verbeuse |
