Oznacza to, że nie wiersze zostaną zwrócone, jeśli @regionjest NULL, kiedy jest stosowany w pierwszym przykładzie, nawet jeśli istnieją wiersze w tabeli, gdzie Regionjest NULL.
Kiedy ANSI_NULLSjest 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 NULLdaje trzecią wartość logiczną - UNKNOWN( w przeciwieństwie do TRUEi FALSE).
UNKNOWNwartości są propagowane przez dowolne łączące operatory boolowskie, jeśli nie zostały jeszcze określone (np. ANDz FALSEoperandem lub ORz TRUEoperandem) lub przez negacje ( NOT).
WHEREKlauzuli filtrujące zbioru wyników wytwarzanego przez FROMklauzulą, tak, że ogólna wartość WHEREmusi ono być TRUEw rzędzie nie są filtrowane. Tak więc, jeśli UNKNOWNzostanie 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 NULLporó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, NULLnie jest równe NULL. A dokumentacja dla= nie ma nic do powiedzenia na temat operandów:
Kiedy porównujesz dwa NULLwyrażenia, wynik zależy od ANSI_NULLSustawienia:
Jeśli ANSI_NULLSjest ustawiona na ON, wynikiem jest NULL1 , zgodnie z konwencją ANSI, zgodnie z którą NULL(lub nieznana) wartość nie jest równa innej NULLlub nieznanej wartości.
Jeśli ANSI_NULLSjest ustawiona na OFF, wynikiem NULLporównania z NULLjest TRUE.
Porównywanie NULLdo nie- NULLwartości zawsze daje FALSE2 .
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 OFFto ustawienie nie ma żadnego wpływu.