Это означает, что никакие строки не будут возвращены, если @region
равно NULL
, при использовании в первом примере, даже если в таблице есть строки, где Region
равно NULL
.
Когда ANSI_NULLS
включен (который вы должны всегда устанавливать в любом случае, так как опция не включать его будет удалена в будущем), любая операция сравнения, в которой (по крайней мере) один из операндов равен NULL
, производиттретье логическое значение - UNKNOWN
(в отличие от TRUE
и FALSE
).
UNKNOWN
значения распространяются через любые объединяющие логические операторы, если они еще не определены (например, AND
соперанд FALSE
или OR
с операндом TRUE
) или отрицания (NOT
).
Предложение WHERE
используется для фильтрации результирующего набора, созданного предложением FROM
,так что общее значение предложения WHERE
должно быть TRUE
, чтобы строка не была отфильтрована.Таким образом, если при любом сравнении получается UNKNOWN
, это приведет к тому, что строка будет отфильтрована.
@ user1227804's answer включает эту цитату:
Если обе стороны сравнения являются столбцами или составными выражениями, настройка не влияет на сравнение.
с SET ANSI_NULLS
*
Однако я не уверен, что именно он пытается сделать, поскольку, если сравниваются два столбца NULL
(например, в JOIN
), сравнение все равно не выполняется:
create table #T1 (
ID int not null,
Val1 varchar(10) null
)
insert into #T1(ID,Val1) select 1,null
create table #T2 (
ID int not null,
Val1 varchar(10) null
)
insert into #T2(ID,Val1) select 1,null
select * from #T1 t1 inner join #T2 t2 on t1.ID = t2.ID and t1.Val1 = t2.Val1
Приведенный выше запрос возвращает 0 строк, тогда как:
select * from #T1 t1 inner join #T2 t2 on t1.ID = t2.ID and (t1.Val1 = t2.Val1 or t1.Val1 is null and t2.Val1 is null)
Возвращает одну строку.Таким образом, даже если оба операнда являются столбцами, NULL
не равно NULL
.И документация для =
не имеет ничего сказать об операндах:
Когда вы сравниваете два выражения NULL
, результат зависит от ANSI_NULLS
настройка:
Если для ANSI_NULLS
установлено значение ON
, результатом будет NULL
1 , в соответствии с соглашением ANSI, что значение NULL
(или неизвестно) не равнодругому NULL
или неизвестному значению.
Если для ANSI_NULLS
установлено значение OFF
, результат NULL
по сравнению с NULL
равен TRUE
.
Сравнение NULL
со значением, отличным от NULL
, всегда приводит к FALSE
2 .
Однако оба 1 и 2 неверны - результат обоих сравнений равен UNKNOWN
.
* Загадочный смысл этого текста был наконец обнаружен спустя годы.На самом деле это означает, что для этих сравнений настройка не действует и всегда действует так, как если бы настройка была ВКЛЮЧЕНА .Было бы яснее, если бы было указано, что параметр SET ANSI_NULLS OFF
не имел значения.