2013-07-03 9 views
5

A Theory Question ...Dove clausola Rifiutare righe se NULL è verificato

Quando una serie di query viene licenziato poi come dato di seguito ...

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 

... dà ...

Actual Result

ho usato A.C1 <> B.C1 nella clausola Where.


Ma mi aspetto ...

enter image description here

Per ottenere il risultato come output avevo bisogno di usare ISNULL(A.C1,'') <> ISNULL(B.C1,'') nella clausola Where previsto.

La mia domanda è perché ho bisogno di utilizzare ISNULL ogni volta per ottenere l'output come previsto, come NULL non è uguale a tutti i dati di stringa.

+1

Perché null ha un significato speciale senza valore. qualsiasi confronto in cui una parte è nullo genererà null e valuterà in falso - leggi qui http://msdn.microsoft.com/en-us/library/ms191504(v=sql.105).aspx –

+4

Qualcosa rispetto a 'NULL' restituisce sempre 'NULL' (sconosciuto) che non è né vero né falso e quindi non può soddisfare i tuoi criteri. –

risposta

4

Citazione di here è perfetto:

Il modo corretto per capire NULL è che non è un valore. Not "questo è un valore NULL" ma "questo NULL non è un valore". Tutto è un valore o non lo è. Quando qualcosa è un valore, è "1", o "ciao" o "verde" o "$ 5,00", ecc., Ma quando qualcosa non è un valore , non è assolutamente nulla. SQL rappresenta "questo non ha valore " dallo speciale non valore NULL. Quando qualcuno dice "il valore NULL ", si dovrebbe essere mentalmente in disaccordo, perché non esiste una cosa del genere. NULL è l'assenza completa e totale di qualsiasi valore.

Null non è uguale a nulla, quindi il confronto fallisce sempre.

Per esempio Prova questa ricerca:

select * 
from Temp2 B 
where B.C1 = null 

non restituirà una riga!

I valori nulli maniglia è necessario utilizzare is null o 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) 

di ritorno esattamente gli stessi valori che la query con ISNULL rendimenti.

Problemi correlati