Ho una query di aggiornamento che aggiorna un campo in una tabella quando il valore non corrisponde a un campo in un'altra tabella.Problemi con confronto SQL e valori nulli
UPDATE table1
SET a.field1 = b.field3
FROM table1 a ,
table2 b
WHERE a.field2 = b.field2
AND a.field1 <> b.field3
Il problema che sto avendo è che non è in ripresa quando a.field1 è nullo e b.field3 è un valore o se a.field1 è un valore e b.field3 è nullo.
ho ottenuto intorno a questo con l'aggiunta del seguente ...
UPDATE table1
SET a.field1 = b.field3
FROM table1 a ,
table2 b
WHERE a.field2 = b.field2
AND (a.field1 <> b.field3
OR (a.field1 IS NOT NULL
AND b.field3 IS NULL)
OR (a.field1 IS NULL
AND b.field3 IS NOT NULL)
)
La mia domanda è più incentrata su perché questo sta accadendo e come migliore struttura della query al fine di impedire questo?
Null è uguale a niente, si tratta di un valore indefinito, che non si può paragonare a nulla (anche se si utilizza '<>'). Ecco perché i record del valore nullo sono omessi. Quindi devi usare 'IS NULL' o' IS NOT NULL' in modo esplicito. –
possibile duplicato di [Non uguale <>! = Operatore in T-SQL su NULL] (http://stackoverflow.com/questions/5658457/not-equal-operator-in-t-sql-on-null) –
I incontrato di recente il problema "opposto". Qualcuno mi ha fornito un'istruzione SQL con un confronto come 'WHERE val = null ...' e * ha effettivamente funzionato * sul nostro sql-server in modo uguale a 'WHERE val IS NULL'! È risultato che c'è un'impostazione 'SET ANSI_NULLS OFF' che è stata attivata sul nostro server. Questa impostazione (deprecata !!) consente confronti nulli, vedere [qui] (https://msdn.microsoft.com/en-gb/en-en/library/ms188048.aspx). – cars10m