SQL Pratique
COALESCE et NULLIF en SQL : guide pratique complet
8 min de lecture

COALESCE et NULLIF en SQL : guide pratique complet

Maîtrisez COALESCE et NULLIF en SQL pour gérer les valeurs nulles. Exemples concrets, cas d'usage en entretien et erreurs à éviter.

Avatar de Thomas LeroyThomas Leroy

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, c
  • NULLIF(x, y) retourne NULL si 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 0
  • NULLIF(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

En entretien, préférez toujours COALESCE aux alternatives propriétaires (ISNULL, IFNULL, NVL) : c'est la syntaxe standard SQL, portable et universellement reconnue.

⚠️ Attention

Ne confondez pas COALESCE et ISNULL sur SQL Server : ISNULL n'accepte que 2 arguments et peut tronquer silencieusement le type de données selon le 1er argument. Préférez COALESCE même sur SQL Server pour éviter ce comportement.

Les pièges à éviter en entretien

Le piège du type de données

COALESCE retourne un type basé sur la priorité de type entre ses arguments. Si vous mélangez un INTEGER et un VARCHAR, certains moteurs lèveront une erreur de conversion implicite.

-- Peut échouer selon le moteur :
SELECT COALESCE(numeric_column, 'Non disponible') FROM table;

-- Correct : cast explicite
SELECT COALESCE(CAST(numeric_column AS VARCHAR), 'Non disponible') FROM table;

Ne pas utiliser COALESCE dans un WHERE sur colonne indexée

Appliquer COALESCE directement sur une colonne dans une clause WHERE empêche l'utilisation de l'index sur cette colonne. Cela peut impacter significativement les performances sur de grandes tables.

-- À éviter (non-sargable) :
WHERE COALESCE(status, 'actif') = 'actif'

-- Préférer :
WHERE status = 'actif' OR status IS NULL

Ce point est souvent testé dans les questions d'optimisation des requêtes SQL.

NULLIF avec des types incompatibles

NULLIF exige que ses 2 arguments soient de types compatibles. Comparer un DATE à une chaîne de caractères provoquera une erreur selon le moteur.

-- Erreur potentielle :
SELECT NULLIF(date_column, '2000-01-01');

-- Correct :
SELECT NULLIF(date_column, DATE '2000-01-01');

Questions fréquentes

Quelle est la différence entre COALESCE et ISNULL ?

COALESCE est standard SQL et accepte un nombre illimité d'arguments. ISNULL est spécifique à SQL Server et n'accepte que 2 arguments. De plus, ISNULL détermine le type de retour en fonction du 1er argument uniquement, ce qui peut entraîner des troncatures silencieuses. En entretien, citez toujours COALESCE comme référence.

COALESCE est-il équivalent à CASE WHEN ?

Fonctionnellement, oui. COALESCE(a, b) est équivalent à CASE WHEN a IS NOT NULL THEN a ELSE b END. La plupart des moteurs SQL optimisent les 2 de façon identique. COALESCE est simplement plus concis et préféré pour la lisibilité.

Comment gérer une division par zéro sans NULLIF ?

Vous pouvez utiliser CASE WHEN denominateur = 0 THEN NULL ELSE numerateur / denominateur END, mais c'est plus verbeux. NULLIF est la solution idiomatique en SQL pour ce problème spécifique et sera reconnu immédiatement par un recruteur technique.

NULLIF peut-il comparer des NULLs ?

Non. NULLIF(NULL, NULL) retourne NULL, mais ce n'est pas parce que les 2 valeurs sont égales — c'est parce que NULL = NULL est UNKNOWN en SQL (pas TRUE). Pour tester l'égalité entre 2 valeurs potentiellement nulles, utilisez IS NOT DISTINCT FROM (PostgreSQL) ou CASE WHEN.

Ces fonctions sont-elles disponibles dans BigQuery ?

Oui. BigQuery (Google Cloud) supporte nativement COALESCE et NULLIF avec la même syntaxe standard. Elles fonctionnent également dans Snowflake, Redshift, DuckDB et Databricks SQL.

Conclusion

COALESCE et NULLIF sont 2 fonctions incontournables pour écrire du SQL défensif et robuste. Maîtriser leur syntaxe, leurs combinaisons et leurs limites vous permet d'éviter des bugs silencieux — erreurs de division, valeurs sentinelles non traitées, types mal gérés — et de montrer une vraie maîtrise en entretien technique.

La prochaine étape : entraînez-vous à les utiliser dans des requêtes analytiques complexes combinant agrégats et filtres. Testez vos compétences directement sur SQL Pratique avec des exercices corrigés qui reproduisent les conditions réelles d'entretien data.

Prêt à vous entraîner ?

50 exercices SQL interactifs avec éditeur en ligne, chronomètre et feedback IA.

Voir les exercices