Le problème est que NULL n'est pas considéré comme égal à rien, même pas à lui-même, mais la partie étrange est qu'il n'est pas non plus égal à lui-même.
Considérez les instructions suivantes (ce qui est illégal en BTW dans SQL Server T-SQL mais valide dans My-SQL, mais c'est ce que ANSI définit pour null, et peut être vérifié même dans SQL Server en utilisant des instructions case, etc.)
SELECT NULL = NULL -- Results in NULL
SELECT NULL <> NULL -- Results in NULL
Il n'y a donc pas de réponse vraie / fausse à la question, mais la réponse est également nulle.
Cela a de nombreuses implications, par exemple dans
- Instructions CASE, dans lesquelles toute valeur nulle utilisera toujours la clause ELSE, sauf si vous utilisez explicitement la condition WHEN IS NULL ( PAS la
WHEN NULL
condition )
- Concaténation de chaînes, as
SELECT a + NULL -- Results in NULL
- Dans une clause WHERE IN ou WHERE NOT IN, comme si vous vouliez des résultats corrects, assurez-vous dans la sous-requête corrélée de filtrer toutes les valeurs nulles.
On peut remplacer ce comportement dans SQL Server en spécifiant SET ANSI_NULLS OFF
, mais ce n'est PAS recommandé et ne doit pas être fait car cela peut provoquer de nombreux problèmes, simplement en raison de la déviation de la norme.
(En remarque, dans My-SQL, il existe une option pour utiliser un opérateur spécial <=>
pour la comparaison nulle.)
En comparaison, dans les langages de programmation généraux, null est traité est une valeur régulière et est égal à lui-même, cependant c'est la valeur NAN qui n'est pas non plus égale à elle-même, mais au moins elle retourne 'false' lors de la comparaison avec elle-même, (et lors de la vérification de non égal à différents langages de programmation ont différentes implémentations).
Notez cependant que dans les langages de base (c'est-à-dire VB, etc.), il n'y a pas de mot-clé "null" et à la place, on utilise le mot-clé "Nothing", qui ne peut pas être utilisé en comparaison directe et à la place, il faut utiliser "IS" comme dans SQL, cependant, il est en fait égal à lui-même (lors de l'utilisation de comparaisons indirectes).