2013-07-03 7 views
5

Eine Theorie Frage ... aufgetretenWhere-Klausel Zeilen abweisen, wenn NULL

Wenn ein Satz von Abfragen wie unten angegeben dann gebrannt wird ...

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 

... gibt ...

Actual Result

I verwendet A.C1 <> B.C1 in der Where Klausel.


Aber ich erwarte ...

enter image description here

Um Ergebnis als Ausgabe zu erhalten erwartete ich ISNULL(A.C1,'') <> ISNULL(B.C1,'') in der Where Klausel zu verwenden, benötigt.

Meine Frage ist, warum muss ich ISNULL jedes Mal für die Ausgabe wie erwartet verwenden, da NULL ungleich String-Daten ist.

+1

Weil null eine spezielle Bedeutung von no value hat. alle Vergleiche, bei denen eine Seite null ist, ergibt null und wird falsch ausgewertet - lesen Sie hier http://msdn.microsoft.com/en-us/library/ms191504(v=sql.105).aspx –

+4

Alles im Vergleich zu 'NULL' gibt immer 'NULL' (unbekannt) zurück, was weder wahr noch falsch ist und daher Ihren Kriterien nicht entsprechen kann. –

Antwort

4

Zitat von here ist perfekt:

Der richtige Weg NULL zu verstehen ist, dass es nicht ein Wert ist. Nicht "Dies ist ein NULL-Wert", aber "dieser NULL ist kein Wert." Alles ist entweder ein Wert, oder es ist nicht. Wenn etwas ein Wert ist, ist es "1", oder "Hallo" oder "grün" oder "$ 5,00" usw. - aber wenn etwas nicht Wert ist, ist es einfach nichts. SQL repräsentiert "das hat keinen Wert" durch den speziellen Nichtwert NULL. Wenn jemand sagt "NULL Wert", sollte man geistig nicht zustimmen, weil es so etwas nicht gibt. NULL ist die vollständige Abwesenheit von irgendeinem Wert.

Null ist nichts gleich, daher schlägt der Vergleich immer fehl.

Zum Beispiel versuchen, diese Abfrage:

select * 
from Temp2 B 
where B.C1 = null 

es jede Zeile nicht zurück!

Der Griff nulls müssen Sie is null oder is not null verwenden:

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) 

Rückkehr genau die gleichen Werte, die Ihre Abfrage mit ISNULL zurückkehrt.

Verwandte Themen