Oznacza to, że nie wiersze zostaną zwrócone, jeśli @region
jest NULL
, kiedy jest stosowany w pierwszym przykładzie, nawet jeśli istnieją wiersze w tabeli, gdzie Region
jest NULL
.
Kiedy ANSI_NULLS
jest włączone (które i tak należy zawsze ustawiać, ponieważ opcja nie włączania tej funkcji zostanie w przyszłości usunięta), każda operacja porównania, w której (przynajmniej) jeden z operandów NULL
daje trzecią wartość logiczną - UNKNOWN
( w przeciwieństwie do TRUE
i FALSE
).
UNKNOWN
wartości są propagowane przez dowolne łączące operatory boolowskie, jeśli nie zostały jeszcze określone (np. AND
z FALSE
operandem lub OR
z TRUE
operandem) lub przez negacje ( NOT
).
WHERE
Klauzuli filtrujące zbioru wyników wytwarzanego przez FROM
klauzulą, tak, że ogólna wartość WHERE
musi ono być TRUE
w rzędzie nie są filtrowane. Tak więc, jeśli UNKNOWN
zostanie utworzone przez jakiekolwiek porównanie, spowoduje to odfiltrowanie wiersza.
@ user1227804 za odpowiedź zawiera ten cytat:
Jeśli obie strony porównania są kolumnami lub wyrażeniami złożonymi, ustawienie nie wpływa na porównanie.
od *SET ANSI_NULLS
Nie jestem jednak pewien, o co chodzi, ponieważ jeśli NULL
porównuje się dwie kolumny (np. W a JOIN
), porównanie nadal się nie udaje:
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
Powyższe zapytanie zwraca 0 wierszy, podczas gdy:
select * from
Zwraca jeden wiersz. Więc nawet jeśli oba operandy są kolumnami, NULL
nie jest równe NULL
. A dokumentacja dla=
nie ma nic do powiedzenia na temat operandów:
Kiedy porównujesz dwa NULL
wyrażenia, wynik zależy od ANSI_NULLS
ustawienia:
Jeśli ANSI_NULLS
jest ustawiona na ON
, wynikiem jest NULL
1 , zgodnie z konwencją ANSI, zgodnie z którą NULL
(lub nieznana) wartość nie jest równa innej NULL
lub nieznanej wartości.
Jeśli ANSI_NULLS
jest ustawiona na OFF
, wynikiem NULL
porównania z NULL
jest TRUE
.
Porównywanie NULL
do nie- NULL
wartości zawsze daje FALSE
2 .
Jednak zarówno 1 , jak i 2 są nieprawidłowe - wynik obu porównań jest taki UNKNOWN
.
* Tajemnicze znaczenie tego tekstu zostało ostatecznie odkryte wiele lat później. W rzeczywistości oznacza to, że dla tych porównań ustawienie nie ma wpływu i zawsze działa tak, jakby było włączone . Byłoby jaśniejsze, gdyby stwierdził, że SET ANSI_NULLS OFF
to ustawienie nie ma żadnego wpływu.