Problèmes avec SQL et de comparaison des valeurs null

J'ai une requête qui met à jour un champ dans une table lorsque la valeur ne correspond pas à un champ d'une autre table.

UPDATE  table1
SET     a.field1 = b.field3
FROM    table1 a ,
        table2 b
WHERE   a.field2 = b.field2
        AND a.field1 <> b.field3

Le problème que j'ai c'est que c'est de ne pas décrocher quand un.champ1 est nulle et b.field3 est une valeur OU si un.champ1 est une valeur et b.field3 est null.

J'ai contourné ce problème en ajoutant ce qui suit...

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)
            )

Ma question est plus centrée autour de pourquoi ce qui se passe et quelle est la meilleure structure de la requête dans le but d'éviter cela?

Null est égal à rien, c'est une valeur non définie qui vous ne peut pas le comparer à quoi que ce soit(même si vous utilisez <>). C'est pourquoi la valeur null dossiers sont omis. Par conséquent, vous devez utiliser IS NULL ou IS NOT NULL explicitement.
double possible de Pas égal à <> != opérateur en T-SQL sur NULL
J'ai couru dans la "face" problème récemment. Quelqu'un a fourni une instruction SQL pour moi involing comparaison WHERE val=null ... et fait sur notre sql-server également à WHERE val IS NULL! Il s'est avéré, il y a un paramètre SET ANSI_NULLS OFF qui a été activé sur notre serveur. Ce (obsolète!!) réglage permet de nulle comparaisons, voir ici.

OriginalL'auteur Heather | 2013-04-10