CodeGym /Cours /SQL SELF /Gestion de NULL dans les calculs avec COALESCE()

Gestion de NULL dans les calculs avec COALESCE()

SQL SELF
Niveau 9 , Leçon 3
Disponible

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.

Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION