Это означает , что ни одна строка не будет возвращена , если @region
есть NULL
, при использовании в первом примере, даже если есть строки в таблице , где Region
находитсяNULL
.
Когда ANSI_NULLS
он включен (который вы всегда должны устанавливать в любом случае, так как опция, чтобы не включать его, будет удалена в будущем), любая операция сравнения, в которой (по крайней мере) один из операндов, NULL
дает третье логическое значение - UNKNOWN
( в отличие от TRUE
и FALSE
).
UNKNOWN
значения распространяются через любые комбинирующие логические операторы, если они еще не определены (например, AND
с FALSE
операндом или OR
с TRUE
операндом) или отрицаниями ( NOT
).
Предложение WHERE
используется для фильтрации набора результатов, созданного FROM
предложением, так что общее значение WHERE
предложения должно быть TRUE
таким, чтобы строка не фильтровалась. Таким образом, если в UNKNOWN
результате какого-либо сравнения будет получено an, строка будет отфильтрована.
@ user1227804 в ответ включает эту цитату:
Если обе стороны сравнения - столбцы или составные выражения, параметр не влияет на сравнение.
от *SET ANSI_NULLS
Однако я не уверен, какой смысл он пытается донести, поскольку при NULL
сравнении двух столбцов (например, в a JOIN
) сравнение все равно не выполняется:
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
Вышеупомянутый запрос возвращает 0 строк, тогда как:
select * from
Возвращает одну строку. Таким образом, даже если оба операнда являются столбцами, 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
это настройка, которая не имеет никакого влияния.