MySQL : afficher NULL comme 0
Pour un petit projet, je devais additionner les valeurs d'une colonne dans MySQL et trier selon ces sommes. Quelque chose comme
SELECT ITEMS.id, SUM(VOTES.modificator) AS score
FROM items ITEMS
LEFT JOIN votes VOTES ON ITEMS.id = VOTES.item
GROUP BY ITEMS.id
ORDER BY score DESC
Mais : oh zut. Quand la table votes ne contient aucune entrée à joindre, la fonction arithmétique renvoie « null ». Or nous voulons trier selon le résultat de cette fonction. Et quelle valeur a null ? Dans mon cas, vraiment 0. Remplaçons donc null par 0, comme ceci :
SELECT ITEMS.id, COALESCE(SUM(VOTES.modificator), 0) AS score
FROM items ITEMS
LEFT JOIN votes VOTES ON ITEMS.id = VOTES.item
GROUP BY ITEMS.id
ORDER BY score DESC
Que fait exactement COALESCE ? En tout cas bien plus qu'une simple « conversion ». COALESCE prend un nombre quelconque de paramètres et renvoie le premier qui contient une valeur (donc qui n'est pas null).
COALESCE(NULL, NULL, 'Hallo', NULL, 'Elefant')
renvoie donc « Hallo ».
Dans notre cas, COALESCE renvoie donc la somme de VOTES.modificator, sauf si la « valeur » (volontairement entre guillemets, car NULL n'est justement PAS une valeur) est null. Nous obtenons alors 0, et nous remplaçons ainsi de fait le résultat de la fonction arithmétique.