Aujourd'hui, on va encore creuser le sujet de la gestion des NULL et découvrir une fonction super utile — COALESCE(). Cette fonction te permet de gérer élégamment les valeurs NULL dans tes données.
Regarde cet exemple : t'as une table avec des infos sur les employés, mais certains n'ont pas de salaire renseigné. Qu'est-ce qui se passe si tu veux augmenter tous les salaires ? Rien de bon. Tu peux pas faire d'opérations avec NULL. Et si tu veux remplacer les salaires NULL par, disons, 0 ? C'est là que COALESCE() entre en scène.
COALESCE() — c'est une fonction qui renvoie la première valeur non-NULL de la liste d'arguments que tu lui donnes. Si tout est NULL dans la liste, la fonction renvoie NULL. En gros, elle dit : "Donne-moi la première valeur potable que tu trouves, stp !"
Syntaxe
COALESCE(value1, value2, ..., value_n)
value1, value2, ..., value_n — ce sont les arguments que tu passes à la fonction. Elle va te renvoyer la première valeur qui n'est pas NULL.
Exemples d'utilisation de COALESCE()
On va voir quelques exemples.
Exemple 1 : Remplacer NULL par 0
Imaginons qu'on a une table salaries :
| id | name | salary |
|---|---|---|
| 1 | Otto | 50000 |
| 2 | Maria | NULL |
| 3 | Alex | 60000 |
| 4 | Anna | NULL |
On veut calculer la somme totale des salaires - c'est facile :
SELECT SUM(salary) AS total_salary
FROM salaries;
La fonction SUM() ignore les NULL, donc pas de souci.
Mais ensuite, on veut calculer la somme totale des salaires si on donne à chaque employé une prime de 1000.
SELECT SUM(salary+1000) AS total_salary
FROM salaries;
Et là, ça part en vrille. Le mieux, c'est de se débarrasser tout de suite des valeurs NULL avec la fonction COALESCE et de les remplacer par 0. Voilà comment faire :
SELECT SUM(COALESCE(salary, 0)) AS total_salary
FROM salaries;
Résultat :
| total_salary |
|---|
| 110000 |
C'est plus propre et plus fiable.
Exemple 2 : Remplacer NULL par une valeur par défaut
Disons qu'on a une table students avec des noms et des adresses :
| id | name | address |
|---|---|---|
| 1 | Anna | Kanne |
| 2 | Peter | NULL |
| 3 | Lisa | Painful |
| 4 | Alex | NULL |
On veut remplacer les NULL dans les adresses par "Non renseigné" :
SELECT name, COALESCE(address, 'Non renseigné') AS resolved_address
FROM students;
Résultat de la requête :
| name | resolved_address |
|---|---|
| Anna | Kanne |
| Peter | Non renseigné |
| Lisa | Painful |
| Alex | Non renseigné |
Exemple 3 : Utiliser plusieurs valeurs
Parfois, il faut remplacer NULL non pas par une seule valeur, mais par toute une série de valeurs. Par exemple, on veut choisir le prénom, le surnom ou utiliser "Sans nom" si aucun n'est renseigné. Table users :
| user_id | first_name | short_name | full_name |
|---|---|---|---|
| 1 | John | Jonny | Johnny Walker |
| 2 | NULL |
Pete | Peter Kamen |
| 3 | NULL |
NULL |
Requête :
SELECT user_id,
COALESCE(first_name, short_name, 'Sans nom') AS display_name
FROM users;
Résultat :
| user_id | display_name |
|---|---|
| 1 | John |
| 2 | Pete |
| 3 | Sans nom |
Utilisation pratique de COALESCE()
En pratique, COALESCE() — c'est un vrai bouée de sauvetage pour bosser avec des données pas parfaites.
Voyons comment ça aide dans différents cas.
Exemple 1 : Remplacer des valeurs dans des champs texte
Table d'origine customers :
| id | name | address |
|---|---|---|
| 1 | Alex Lin | 123 Maple St |
| 2 | Maria Chi | NULL |
| 3 | Anna Song | 456 Oak Ave |
| 4 | Otto Art | NULL |
| 5 | Liam Park | 789 Pine Rd |
Requête :
SELECT name, COALESCE(address, 'Non renseigné') AS address
FROM customers;
Résultat :
| name | address |
|---|---|
| Alex Lin | 123 Maple St |
| Maria Chi | Non renseigné |
| Anna Song | 456 Oak Ave |
| Otto Art | Non renseigné |
| Liam Park | 789 Pine Rd |
Exemple 2 : Préparer des données pour les rapports
Table d'origine sales :
| id | product | price |
|---|---|---|
| 1 | Widget A | 100 |
| 2 | Widget B | NULL |
| 3 | Widget C | 250 |
| 4 | Widget D | NULL |
| 5 | Widget E | 300 |
Requête :
SELECT SUM(COALESCE(price, 0)) AS total_sales
FROM sales;
Résultat :
| total_sales |
|---|
| 650 |
Erreurs courantes avec COALESCE()
Même si COALESCE() paraît simple et universelle, tu peux tomber sur quelques pièges.
Incompatibilité des types de données. Tous les arguments passés à COALESCE() doivent être compatibles niveau type de données. Par exemple, tu peux pas mélanger des chaînes de caractères et des nombres.
-- Erreur
SELECT COALESCE(salary, 'Non renseigné') FROM employees;
-- salary — champ numérique, et 'Non renseigné' — texte.
Ignorer l'ordre des arguments. COALESCE() renvoie la première valeur non-NULL, donc l'ordre des arguments est super important.
GO TO FULL VERSION