それは場合は行が返されないことを意味し@regionているNULL行がテーブルにある場合でもどこ、あなたの最初の例で使用した場合、RegionありますNULL。
ANSI_NULLSがオンの場合(オンにしないオプションは将来削除されるため、とにかく常にオンに設定する必要があります)、(少なくとも)オペランドの1つがNULL3番目の論理値を生成する比較操作- UNKNOWN(TRUEおよびとは対照的にFALSE)。
UNKNOWN彼らはすでに(例えば決まっていない場合の値は、任意の組み合わせブール演算子を介して伝播ANDしてFALSEオペランドまたはORでTRUEオペランド)または否定(NOT)。
WHERE句により生成された結果セットをフィルタリングするために使用されるFROM句を、全体の値ようにWHERE節がなければならないTRUE行について除外されないように。したがって、UNKNOWN比較によってが生成された場合、行は除外されます。
@ user1227804の回答には、次の引用が含まれています。
比較の両側が列または複合式である場合、設定は比較に影響しません。
から SET ANSI_NULLS*
ただし、2つのNULL列を比較した場合(たとえば、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
1行を返します。したがって、両方のオペランドが列の場合でも、NULLは等しくありませんNULL。そして、のドキュメントに=は、オペランドについて何も言うことはありません。
2つのNULL式を比較すると、結果はANSI_NULLS設定によって異なります。
ANSI_NULLSがに設定されている場合、(または不明な)値が別の値または不明な値と等しくないというANSI規則に従ってON、結果はNULL1になります。NULLNULL
ANSI_NULLSがに設定されている場合OFF、NULL比較の結果NULLはTRUEです。
値以外と比較するNULLと、NULL常にFALSE2になります。
ただし、1と2の両方が正しくありませんUNKNOWN。両方の比較の結果はです。
*このテキストの不可解な意味は、数年後にようやく発見されました。実際の意味は、これらの比較では、設定は効果がなく、常に設定がオンであるかのように機能するということです。それがSET ANSI_NULLS OFF影響を及ぼさなかった設定であると述べていたら、もっと明確だっただろう。