En SQL, la valeur NULL signifie "inconnue" ou "absence de" valeur. Elle se comporte de manière particulière :
NULL avec n'importe quelle valeur par = ou <> donne toujours un résultat UNKNOWN, et non TRUE ou FALSE.NULL à l'aide de IS NULL ou IS NOT NULL.NULL donnera NULL.Exemple :
SELECT * FROM users WHERE name = NULL; -- ne renverra aucune ligne SELECT * FROM users WHERE name IS NULL; -- correct SELECT 1 + NULL; -- Résultat : NULL
Pour remplacer NULL, on utilise des fonctions comme COALESCE(foo, 0) (prend la première valeur non-NULL) ou ISNULL(foo, 'default') dans SQL Server.
Question : Quel résultat renverra la condition WHERE some_column <> 'value' dans les lignes où some_column est NULL ?
Réponse :
Dans ces lignes, la condition ne sera pas satisfaite : la comparaison avec NULL donnera UNKNOWN, et non TRUE. Par conséquent, les lignes avec NULL ne seront pas incluses dans la sélection.
Exemple :
-- some_column | ... -- NULL | ... -- 'abc' | ... -- 'value' | ... SELECT * FROM table WHERE some_column <> 'value'; -- La ligne avec NULL ne sera pas incluse
Histoire
WHERE status <> 'closed' ne tenait pas compte des comptes avec la valeur status = NULL (par exemple, les nouvelles demandes). En conséquence, le nombre de comptes actifs a été incorrectement compté — le nombre s'est avéré 15 % inférieur.Histoire
COALESCE(user_name, 'Cher client') a été oublié dans l'envoi. Près d'un millier de clients ont reçu des messages sans nom du tout, ce qui a été perçu comme une erreur d'automatisation.Histoire
Lors de la migration de la base, LEFT JOIN renvoyait plus de lignes que prévu. Il s'est avéré que la table de gauche contenait des champs avec NULL; des filtres de type WHERE b.field = 'X' après le JOIN rejetaient ces lignes, entraînant une perte de parties des données.