2013-07-03 23 views
5

teoria pytanie ...Gdzie Klauzula Odrzucanie wiersze NULL jeśli wystąpił

Kiedy zestaw zapytań podane poniżej jest zwolniony wtedy ...

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 

... daje ...

Actual Result

użyłem A.C1 <> B.C1 w klauzuli Where.


Ale spodziewam ...

enter image description here

Aby spodziewany rezultat jako wyjście Musiałem użyć ISNULL(A.C1,'') <> ISNULL(B.C1,'') w klauzuli Where.

Moje pytanie brzmi: dlaczego muszę używać ISNULL za każdym razem, aby uzyskać dane wyjściowe zgodnie z oczekiwaniami, ponieważ NULL nie jest równe żadnym ciągom danych.

+1

Ponieważ wartość null ma specjalne znaczenie bez wartości. wszelkie porównania, w których jedna strona ma wartość null, przyniosą wartość zerową i staną się wartościami false - przeczytaj tutaj http://msdn.microsoft.com/en-us/library/ms191504(v=sql.105).aspx –

+4

Wszystko w porównaniu do 'NULL' zawsze zwraca 'NULL' (nieznany), który nie jest ani prawdziwy, ani fałszywy i dlatego nie może spełnić twoich kryteriów. –

Odpowiedz

4

Cytat here jest doskonała:

Prawidłowy sposób zrozumieć NULL to, że nie jest wartością. Nie "jest to wartość NULL", ale "ta wartość NULL nie jest wartością." Wszystko, co albo jest wartością, albo nią nie jest. Gdy coś jest wartością, jest "1", lub "cześć", "zielony" lub "5,00 $" itd. - ale gdy coś nie jest wartością , po prostu nie jest niczym. SQL reprezentuje "nie ma wartości " przez specjalną wartość NULL. Kiedy ktoś mówi "wartość NULL ", należy się nie zgadzać, ponieważ nie ma czegoś takiego. NULL to kompletny, całkowity brak jakiejkolwiek wartości.

Null nie jest równy czemukolwiek, dlatego porównanie zawsze kończy się niepowodzeniem.

Na przykład spróbuj to zapytanie:

select * 
from Temp2 B 
where B.C1 = null 

nie powróci dowolny wiersz!

wartości null uchwyt trzeba użyć is null lub 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) 

powrotne dokładnie te same wartości, które zapytanie z ISNULL zwrotów.