Cela signifie qu'aucune ligne ne sera retournée si @region
est NULL
, lorsqu'elle est utilisée dans votre premier exemple, même s'il y a des lignes dans la table où Region
est NULL
.
Quand ANSI_NULLS
est activé (ce que vous devriez toujours activer de toute façon, puisque l'option de ne pas l'activer va être supprimée à l'avenir), toute opération de comparaison où (au moins) l'un des opérandes est NULL
produit la troisième valeur logique - UNKNOWN
( par opposition à TRUE
et FALSE
).
UNKNOWN
les valeurs se propagent à travers tout opérateur booléen combinant si elles ne sont pas déjà décidées (par exemple AND
avec un FALSE
opérande ou OR
avec un TRUE
opérande) ou des négations ( NOT
).
La WHERE
clause est utilisée pour filtrer le jeu de résultats produit par la FROM
clause, de sorte que la valeur globale de la WHERE
clause doit être TRUE
pour que la ligne ne soit pas filtrée. Ainsi, si un UNKNOWN
est produit par une comparaison, cela entraînera le filtrage de la ligne.
La réponse de @ user1227804 comprend cette citation:
Si les deux côtés de la comparaison sont des colonnes ou des expressions composées, le paramètre n'affecte pas la comparaison.
à partir de *SET ANSI_NULLS
Cependant, je ne sais pas sur quel point il essaie de faire valoir, car si deux NULL
colonnes sont comparées (par exemple en a JOIN
), la comparaison échoue toujours:
create table
ID int not null,
Val1 varchar(10) null
)
insert into
create table
ID int not null,
Val1 varchar(10) null
)
insert into
select * from
La requête ci-dessus renvoie 0 ligne, alors que:
select * from
Renvoie une ligne. Donc, même lorsque les deux opérandes sont des colonnes, cela NULL
n'est pas égal NULL
. Et la documentation de=
n'a rien à dire sur les opérandes:
Lorsque vous comparez deux NULL
expressions, le résultat dépend du ANSI_NULLS
paramètre:
Si ANSI_NULLS
est défini sur ON
, le résultat est NULL
1 , suivant la convention ANSI selon laquelle une valeur NULL
(ou inconnue) n'est pas égale à une autre NULL
valeur inconnue.
Si ANSI_NULLS
est défini sur OFF
, le résultat de NULL
comparé à NULL
est TRUE
.
La comparaison NULL
avec une non- NULL
valeur donne toujours FALSE
2 .
Cependant, 1 et 2 sont incorrects - le résultat des deux comparaisons est UNKNOWN
.
* La signification cryptique de ce texte a finalement été découverte des années plus tard. Cela signifie en fait que, pour ces comparaisons, le paramètre n'a aucun effet et agit toujours comme si le paramètre était activé . Cela aurait été plus clair s'il avait déclaré que SET ANSI_NULLS OFF
c'était le paramètre qui n'avait aucun effet.