cosa è “= null” e “IS NULL”

Qual è la differenza tra “= null” e “IS NULL”? Come sono usati diversamente?

In una clausola WHERE , column=null non sarà mai true, non è valido utilizzare null in questo modo, devi dire la column IS NULL o la column IS NOT NULL . Questo parla della natura speciale di NULL , non è un valore da controllare per l’uguaglianza di, è un valore sconosciuto, quindi è necessario utilizzare la syntax IS o IS NOT .

Puoi assegnare qualcosa al valore NULL usando = uguale. Ad esempio: UPDATE TableX SET Column=NULL...

links:
Wikipedia NUll (SQL)
w3schools SQL NULL Values
Esercitazione SQL, vedere la sezione IS NULL Operator

“= NULL” è un’espressione di valore Ora “IS NULL” è il metodo preferito per valutare la condizione di una variabile NULL.

Una discussione più dettagliata sulla stessa domanda può essere trovata nel seguente link

http://www.sqlservercentral.com/articles/T-SQL/understandingthedifferencebetweenisnull/871/

Non sono sicuro se si può leggere l’articolo senza accedere al sito, quindi postare la copia dello stesso qui

Capire la differenza tra “IS NULL” e “= NULL”

Quando una variabile viene creata in SQL con l’istruzione dichiarare, viene creata senza dati e archiviata nella tabella delle variabili (vtable) all’interno dello spazio di memoria di SQL. Il vtable contiene il nome e l’indirizzo di memoria della variabile. Tuttavia, quando viene creata la variabile, nessun indirizzo di memoria viene assegnato alla variabile e quindi la variabile non viene definita in termini di memoria.

Quando si imposta la variabile, viene assegnato un indirizzo di memoria e i dati iniziali vengono memorizzati in tale indirizzo. Quando si imposta nuovamente il valore, i dati nell’indirizzo di memoria puntato dalla variabile vengono quindi modificati nel nuovo valore.

Ora per la differenza e perché ognuno si comporta come fa.

“= NULL”

“= NULL” è un’espressione di valore. Significato, se la variabile è stata impostata e la memoria creata per la memorizzazione dei dati ha un valore. Una variabile può infatti essere impostata su NULL, il che significa che il valore dei dati degli oggetti è sconosciuto. Se il valore è stato impostato in questo modo:

 DECLARE @val CHAR(4) SET @val = NULL 

Hai impostato in modo esplicito il valore dei dati su sconosciuto e quindi quando lo fai:

 If @val = NULL 

Valuterà come una vera espressione.

Ma se lo faccio:

 DECLARE @val CHAR(4) If @val = NULL 

Valuterà su falso.

La ragione di ciò è il fatto che sto verificando NULL come valore di @val. Poiché non ho SET il valore di @val, non è stato assegnato alcun indirizzo di memoria e quindi non esiste alcun valore per @val.

Nota: vedere la sezione su SET ANSI_NULLS (ON | OFF) a causa delle differenze nelle impostazioni predefinite di SQL 7 e 2000 che causano il mancato funzionamento degli esempi. Questo è basato su SQL 7.

“È ZERO”

Ora “IS NULL” è un po ‘più complicato ed è il metodo preferito per valutare la condizione di una variabile NULL. Quando si utilizza la clausola “IS NULL”, controlla sia l’indirizzo della variabile che i dati all’interno della variabile come sconosciuti. Quindi se per esempio faccio:

 DECLARE @val CHAR(4) If @val IS NULL PRINT 'TRUE' ELSE PRINT 'FALSE' SET @val = NULL If @val IS NULL PRINT 'TRUE' ELSE PRINT 'FALSE' 

Entrambe le uscite saranno VERO. Il motivo è nel primo @val IS NULL Ho solo dichiarato la variabile e non è stato impostato alcuno spazio di indirizzi per i dati per cui è “IS NULL”. E nel secondo il valore è stato esplicitamente impostato su NULL che controlla anche “IS NULL”.

SET ANSI_NULLS (ON | OFF)

Ora lasciami un nodo nelle opere. Negli esempi precedenti vedi che = NULL funzionerà fintanto che il valore è impostato in modo esplicito. Tuttavia, quando SET ANSI_NULLS ON le cose si comporteranno in modo leggermente diverso.

Ex.

 DECLARE @val CHAR(4) SET @val = NULL SET ANSI_NULLS ON If @val =NULL PRINT 'TRUE' ELSE PRINT 'FALSE' SET ANSI_NULLS OFF If @val =NULL PRINT 'TRUE' ELSE PRINT 'FALSE' 

Si noterà la prima volta che si esegue l’istruzione = NULL dopo aver eseguito SET ANSI_NULLS ON si ottiene un FALSE e dopo aver impostato OFF si ottiene un VERO. La ragione è la seguente.

Estratto dall’articolo SQL BOL “SET ANSI_NULLS”

Lo standard SQL-92 richiede che un confronto equals (=) o non uguale a (<>) rispetto a un valore null valuti a FALSE. Quando SET ANSI_NULLS è ON, un’istruzione SELECT che utilizza WHERE column_name = NULL restituisce zero righe anche se esistono valori null in column_name. Un’istruzione SELECT che utilizza WHERE nome_colonna <> NULL restituisce zero righe anche se non ci sono valori non nulli in nome_colonna.

Quando SET ANSI_NULLS è OFF, gli operatori di confronto Equals (=) e Not Equal To (<>) non seguono lo standard SQL-92. Un’istruzione SELECT che utilizza WHERE column_name = NULL restituisce le righe con valori null in column_name. Un’istruzione SELECT che utilizza WHERE nome_colonna <> NULL restituisce le righe con valori non nulli nella colonna. Inoltre, un’istruzione SELECT che utilizza WHERE column_name <> XYZ_value restituisce tutte le righe che non sono il valore XYZ e che non sono NULL.

Fine Estratto

Quindi, come definito da SQL92, “= NULL” dovrebbe sempre valutare false. Quindi, anche impostando esplicitamente il valore significa che non si incontrerà mai il = NULL se la condizione e il codice potrebbero non funzionare come previsto. Il più grande motivo per cui = NULL ti sparerà nel piede è questo, SQL 7 quando viene spedito e installato è predefinito su ANSI_NULL OFF ma SQL 2000 è impostato su ANSI_NULL ON. Ovviamente è ansible modificare questo metodo in vari modi, ma se si è aggiornato un database da 7 a 2000 e si è riscontrato che il = NULL ha funzionato solo quando si imposta esplicitamente quando si distribuisce un server 2000 predefinito, il codice si interrompe e può causare problemi ai dati.

Ancora un altro motivo per utilizzare IS NULL invece che sotto le linee guida SQL 92 è ancora in corso di valutazione su TRUE e quindi il codice è più sicuro per l’aggiornamento del server.

Sommario

Se il riepilogo a meno che non sia necessario verificare che il valore di una variabile sia stato impostato su NULL e che ANSI_NULLS sia stato impostato su ON, utilizzare sempre la clausola “IS NULL” per convalidare se una variabile è NULL. Usando = NULL, invece, puoi causare un sacco di mal di testa nel tentativo di risolvere i problemi che potrebbero sorgere da esso, ora o inaspettatamente in futuro.

Base

Alcune delle informazioni fornite provengono da come funziona C ++ e da come si comporta SQL in ogni circostanza. Sfortunatamente, SQL, per quanto ne so, non ha un indirizzo di funzione che mi permetta di generare l’indirizzo di memoria reale per mostrare cosa succede sotto il cofano. In C ++ quando viene creata una variabile, la variabile ha un indirizzo di 0xddddddd (nel debug ma può anche essere diverso da indirizzi non reali). Quando si imposta la variabile per la prima volta, il controllo dell’indirizzo fornisce un indirizzo di memoria valido in cui vengono archiviati i dati. Inoltre, è ansible ottenere ulteriori informazioni dalla documentazione in linea di SQL nelle sezioni su IS NULL e SET ANSI_NULLS ….

= NULL viene utilizzato per l’assegnazione a un valore NULL mentre IS NULL viene utilizzato per determinare se una variabile è valutata NULL.

Esempio di sssignment su NULL:

 Update TableName Set ColumnName = NULL 

Esempio di confronto con un valore NULL in una clausola condizionale ( collegamento ):

 Select * From TableName Where ColumnName is NULL 

ColumnName IS NOT Null può essere utilizzato anche per assicurarsi che un valore non sia NULL.