2012-03-06 11 views

risposta

90

In SQL, un confronto tra un valore null e qualsiasi altra valore (compreso un altro null) utilizzando un operatore di confronto (ad esempio =, !=, <, ecc.) verrà generato un null, che è considerato come false ai fini di una clausola where (in senso stretto, è "non vero", piuttosto che "falso", ma l'effetto è lo stesso).

Il ragionamento è che uno null significa "sconosciuto", quindi il risultato di qualsiasi confronto con un null è anche "sconosciuto". Quindi non otterrai risultati nelle righe codificando where my_column = null.

SQL fornisce la sintassi speciale per testare se una colonna è null, tramite is null e is not null, che è una condizione particolare per verificare un null (o meno una null).

Ecco alcuni SQL che mostrano una varietà di condizioni e il loro effetto come sopra.

create table t (x int, y int); 
insert into t values (null, null), (null, 1), (1, 1); 

select 'x = null' as test , x, y from t where x = null 
union all 
select 'x != null', x, y from t where x != null 
union all 
select 'not (x = null)', x, y from t where not (x = null) 
union all 
select 'x = y', x, y from t where x = y 
union all 
select 'not (x = y)', x, y from t where not (x = y); 

ritorni soltanto 1 fila (come previsto):

TEST X Y 
x = y 1 1 

vedere questo in esecuzione su SQLFiddle

+4

e come 'is null' funziona. – joshua

+1

Ancora molti problemi con questa risposta. "un confronto con null è sempre considerato falso" - non nel controllo dei vincoli, come già sottolineato, e non in casi speciali, ad es. 'NULL IS NULL' è un confronto che valuterà su TRUE. "null significa 'unknown'" - null è un segnaposto per un valore che dovrebbe essere presente ma per qualche motivo è attualmente mancante ed è l'applicazione (non il null) che fornisce il significato semantico (sconosciuto, non si applica, testimone non rispondeva, ecc.) "se un nullo è in una lista ..." il tuo esempio sembra coinvolgere una tabella, non una lista. – onedaywhen

+1

@onedayquando pensavo di essere chiaro ... per "confronto" intendo '=' o '! =' Etc, * not * 'IS NULL' o' IS NOT NULL'. FYI il risultato di una selezione di una sola colonna, come usato in 'IN (SELECT ...)', è chiamato una "lista" – Bohemian

4

In primo luogo è corretto modo di controllare se un valore di campo è null tempo dopo non funziona il modo in cui ci si aspetta che a causa null è il valore speciale, che non è uguale niente, quindi non è possibile utilizzare confronto di uguaglianza utilizzando = per esso.

Così, quando è necessario verificare se un valore di campo è null o no, utilizzare:

where x is null 

invece di:

where x = null 
51

E 'importante notare, che NULL non è uguale a NULL.

NULL non è un valore e pertanto non può essere confrontato con un altro valore.

where x is null controlla se x è un valore nullo.

where x = null sta verificando se x è uguale a NULL, che non sarà mai vero

+1

Null è un valore, è solo un valore sconosciuto. Come nei linguaggi di programmazione, la variabile può avere valore null. Inoltre puoi confrontare se (varA! = Null). In sql anche se è trattato in modo diverso come hai fatto notare. – broadband

+0

@broadband: null non è un valore, proprio come l'infinito non è un numero. È più una cosa filosofica però ... Sì, puoi assegnare "null" a una variabile, ma ciò significa semplicemente che stai disattivando o reimpostando tale variabile. 0 o "" sarebbe un valore, ma null in modo efficace significa "questa variabile non ha valore". – Sygmoral

+0

@Sygmoral internamente quando scrivi in ​​C# string a = null, significa che stai impostando il valore 'null' sulla variabile' a'. Ma l'interpretazione per programmatore è come hai detto tu: "questa variabile non ha valore". Ulteriore più in sql null può avere più interpretazioni o logica a tre valori. – broadband

3

penso che l'uguaglianza è qualcosa che può essere assolutamente determinato. Il problema con null è che è intrinsecamente sconosciuto. null combinato con qualsiasi altro valore è nullo - sconosciuto. Chiedere SQL "Il mio valore è uguale a null?" sarebbe sconosciuto ogni volta, anche se l'input è nullo. Penso che l'implementazione di IS NULL chiarisca.

Problemi correlati