COALESCE renvoie la première valeur de sa liste qui n’est pas NULL. C’est la façon dont SQL remplace une valeur manquante par une valeur de repli. Les exemples fonctionnent dans PostgreSQL, MySQL, SQLite et SQL Server.
Comment utiliser COALESCE
Passe à COALESCE autant de valeurs que tu veux. Il les vérifie de gauche à droite et renvoie la première qui n’est pas NULL, ou NULL si elles le sont toutes :
COALESCE(value1, value2, ...)
SELECT COALESCE(NULL, 'second', 'third');
-- Output: second
SELECT COALESCE(NULL, NULL);
-- Output: NULL
Dans une vraie requête, les valeurs sont généralement des colonnes, avec un littéral à la fin en dernier recours :
-- Input: users
-- id | name | nickname
-- ---+--------------+---------
-- 1 | Maria Garcia | Mia
-- 2 | Tom Becker | NULL
-- 3 | Priya Shah | P
SELECT id, name, COALESCE(nickname, name) AS display_name
FROM users;
-- Output:
-- id | name | display_name
-- ---+--------------+-------------
-- 1 | Maria Garcia | Mia
-- 2 | Tom Becker | Tom Becker
-- 3 | Priya Shah | P
Les règles à connaître
- Il s’arrête à la première valeur non NULL, donc les arguments suivants ne sont pas évalués une fois qu’une valeur est trouvée. Mets en premier la valeur la plus souvent renseignée.
- Tous les arguments doivent avoir un type compatible. Mélanger un nombre et du texte échoue dans PostgreSQL et SQL Server, alors fais d’abord un cast :
-- Input: products
-- name | stock
-- -------------+------
-- Desk Lamp | 12
-- Office Chair | NULL
SELECT name, COALESCE(stock, 'N/A') AS stock FROM products;
-- PostgreSQL: ERROR: invalid input syntax for type integer: "N/A"
-- SQL Server: Conversion failed when converting the varchar value 'N/A' to data type int.
-- (in MySQL, cast with CAST(stock AS CHAR))
SELECT name, COALESCE(CAST(stock AS VARCHAR(10)), 'N/A') AS stock FROM products;
-- Output:
-- name | stock
-- -------------+------
-- Desk Lamp | 12
-- Office Chair | N/A
-
Une chaîne vide n’est pas NULL. COALESCE laisse passer
''tel quel. Entoure la colonne deNULLIF(column, '')pour traiter aussi les chaînes vides comme manquantes :
SELECT COALESCE('', 'No name');
-- Output: '' (an empty string)
SELECT COALESCE(NULLIF('', ''), 'No name');
-- Output: No name
Syntaxe alternative
Tu verras aussi des raccourcis à deux arguments : IFNULL dans MySQL et SQLite, et ISNULL dans SQL Server :
SELECT IFNULL(NULL, 'fallback');
-- Output: fallback
Préfère COALESCE. Il accepte autant d’arguments que tu veux, et le ISNULL de SQL Server donne à son résultat le type du premier argument, ce qui peut tronquer ta valeur de repli :
-- SQL Server
DECLARE @code VARCHAR(2) = NULL;
SELECT ISNULL(@code, 'none') AS with_isnull, COALESCE(@code, 'none') AS with_coalesce;
-- Output:
-- with_isnull | with_coalesce
-- ------------+--------------
-- no | none
Une expression CASE peut faire le même travail, en plus long : COALESCE(nickname, name) est un raccourci pour CASE WHEN nickname IS NOT NULL THEN nickname ELSE name END. Consulte le guide de l’instruction CASE en SQL quand tu as besoin de plus de puissance.
Quand utiliser COALESCE ?
Utilise COALESCE dès qu’un NULL rendrait ton résultat faux, moche ou vide. La plupart des usages entrent dans l’un de ces quatre cas.
Se rabattre sur une autre colonne
Quand la valeur que tu cherches se trouve dans l’une de plusieurs colonnes, COALESCE prend la première qui est renseignée : un surnom ou un nom complet, un portable ou un fixe, une adresse de livraison ou de facturation.
Utiliser une valeur par défaut quand tout manque
Mets un littéral à la fin de la liste et le résultat ne sera jamais NULL. C’est ce qu’il te faut pour les rapports et les écrans, où « Adresse inconnue » ou 0.00 se lit mieux qu’un vide.
Combler les trous avec une valeur calculée
La valeur de repli n’a pas besoin d’être une colonne ou une constante. Ça peut être une expression, comme un nom d’utilisateur ou une adresse email construits à partir d’autres colonnes, ce qui rend COALESCE pratique pour nettoyer des données importées.
Garder les NULL hors des calculs
Toute opération arithmétique avec un NULL donne NULL, donc une remise ou une prime manquante efface tout le total. COALESCE(discount, 0) transforme la valeur manquante en un nombre utilisable par le calcul.
Exemples concrets de COALESCE
Afficher un prix, quel que soit celui enregistré
Les produits peuvent avoir un prix soldé, un prix normal ou (avant le lancement) aucun des deux. Vérifie-les dans l’ordre et mets zéro par défaut :
-- Input: products
-- product_id | name | sale_price | regular_price
-- -----------+---------------+------------+--------------
-- 1 | Desk Lamp | 19.99 | 24.99
-- 2 | Office Chair | NULL | 149.00
-- 3 | Standing Desk | NULL | NULL
SELECT product_id, name, COALESCE(sale_price, regular_price, 0.00) AS price
FROM products;
-- Output:
-- product_id | name | price
-- -----------+---------------+-------
-- 1 | Desk Lamp | 19.99
-- 2 | Office Chair | 149.00
-- 3 | Standing Desk | 0.00
Choisir le meilleur numéro à appeler
Les contacts ont jusqu’à trois numéros. Affiche le premier disponible, et indique-le quand il n’y en a aucun :
-- Input: contacts
-- name | primary_phone | mobile_phone | work_phone
-- -----+---------------+--------------+-----------
-- Ada | 555-0101 | 555-0199 | NULL
-- Bo | NULL | 555-0142 | 555-0177
-- Cy | NULL | NULL | 555-0123
-- Di | NULL | NULL | NULL
SELECT name, COALESCE(primary_phone, mobile_phone, work_phone, 'No phone') AS phone
FROM contacts;
-- Output:
-- name | phone
-- -----+---------
-- Ada | 555-0101
-- Bo | 555-0142
-- Cy | 555-0123
-- Di | No phone
Générer une adresse email provisoire
Les employés sans email enregistré en reçoivent un construit à partir de leur nom, pour que chaque ligne de l’annuaire ait une valeur :
-- Input: employees
-- employee_id | first_name | last_name | email
-- ------------+------------+-----------+-----------------
-- 1 | Grace | Hopper | ghopper@navy.mil
-- 2 | Alan | Turing | NULL
SELECT
employee_id,
first_name || ' ' || last_name AS full_name,
COALESCE(
email,
LOWER(first_name) || '.' || LOWER(last_name) || '@company.com'
) AS email
FROM employees;
-- Output:
-- employee_id | full_name | email
-- ------------+--------------+------------------------
-- 1 | Grace Hopper | ghopper@navy.mil
-- 2 | Alan Turing | alan.turing@company.com
Dans MySQL et SQL Server, concatène les chaînes avec CONCAT() au lieu de ||.
Calculer le total d’une commande avec des remises optionnelles
Sans COALESCE, une seule ligne sans remise fausse le total de toute la commande, car SUM ignore complètement les lignes NULL :
-- Input: order_items
-- order_id | product | quantity | unit_price | discount
-- ---------+----------+----------+------------+---------
-- 101 | Keyboard | 1 | 49.00 | 5.00
-- 101 | Mouse | 2 | 19.50 | NULL
-- 102 | Monitor | 1 | 189.00 | NULL
-- 102 | Cable | 3 | 6.00 | 2.00
-- Wrong: lines with a NULL discount drop out of the total
SELECT order_id, SUM(quantity * unit_price - discount) AS total
FROM order_items
GROUP BY order_id
ORDER BY order_id;
-- Output:
-- order_id | total
-- ---------+------
-- 101 | 44.00
-- 102 | 16.00
-- Right: a missing discount counts as 0
SELECT order_id, SUM(quantity * unit_price - COALESCE(discount, 0)) AS total
FROM order_items
GROUP BY order_id
ORDER BY order_id;
-- Output:
-- order_id | total
-- ---------+-------
-- 101 | 83.00
-- 102 | 205.00
Pour aller plus loin avec COALESCE
Sur ce blog :
-
COALESCE dans MySQL : COALESCE et le
IFNULLde MySQL - Guide de l’instruction CASE en SQL : de la logique conditionnelle au-delà des tests de NULL
- Guide de l’opérateur « différent de » en SQL : pourquoi les comparaisons avec NULL ne correspondent jamais
- Guide de GROUP BY en SQL : les agrégats que COALESCE alimente souvent
- Guide de SUBSTRING en SQL : extraire du texte de colonnes qui peuvent être NULL
Documentation officielle :
Beekeeper Studio est une interface de base de données gratuite & open source
Le meilleur outil de requêtes & éditeur SQL que j’aie jamais utilisé. Il m’offre tout ce dont j’ai besoin pour gérer ma base de données. - ⭐⭐⭐⭐⭐ Mit
Beekeeper Studio est rapide, intuitif et facile à utiliser. Beekeeper prend en charge plein de bases de données et fonctionne parfaitement sous Windows, Mac et Linux.
Ce que les utilisateurs disent de Beekeeper Studio
« Beekeeper Studio a complètement remplacé mon ancien workflow SQL. C’est rapide, intuitif, et ça rend le travail sur les bases de données agréable à nouveau. »
« J’ai essayé beaucoup d’interfaces de bases de données, mais Beekeeper trouve l’équilibre parfait entre fonctionnalités et simplicité. Ça marche, tout simplement. »