Où clause rejetant des lignes si NULL s'est produite

Une question théorique …

Quand un set de requêtes comme indiqué ci-dessous est déclenché alors …

Create table Temp1(C1 varchar(2)) Create table Temp2(C1 varchar(2)) insert into Temp1 Values('A'),(NULL),('B') insert into Temp2 Values('B'),(NULL),('C'),(NULL) select *from Temp1 A,Temp2 B where A.C1 <> B.C1 

… donne …

Résultat actuel

J'ai utilisé A.C1 <> B.C1 dans la clause Where .


Mais je m'attends à …

entrez la description de l'image ici

Pour get le résultat attendu en sortie, je devais utiliser ISNULL(A.C1,'') <> ISNULL(B.C1,'') dans la clause Where .

Ma question est pourquoi ai-je besoin d'utiliser ISNULL chaque fois pour get la sortie comme prévu, car NULL n'est pas égal à toutes datatables de string.

La citation d' ici est parfaite:

La façon correcte de comprendre NULL est que ce n'est pas une valeur. Pas "ceci est une valeur NULL" mais "cette valeur NULL n'est pas une valeur." Tout est soit une valeur, soit elle ne l'est pas. Quand quelque chose est une valeur, c'est "1", "bonjour", "vert", ou "$ 5.00" etc – mais quand quelque chose n'est pas une valeur, ce n'est tout simplement rien. SQL représente "ceci n'a pas de valeur" par la non-valeur spéciale NULL. Quand quelqu'un dit "la valeur NULL", on devrait être en désaccord mentalement, parce qu'il n'y a pas de telle chose. NULL est l'absence complète et totale de toute valeur.

Null n'est égal à rien, donc la comparaison échoue toujours.

Par exemple, essayez cette requête:

 select * from Temp2 B where B.C1 = null 

il ne returnnera aucune ligne!

Les pseudonymes que vous devez utiliser is null ou is not null :

 select * from Temp1 A, Temp2 B where A.C1 <> B.C1 or (A.C1 is null and B.C1 is not null) or (B.C1 is null and A.C1 is not null) 

renvoie exactement les mêmes valeurs que votre requête avec ISNULL renvoie.