それは場合は行が返されないことを意味し@region
ているNULL
行がテーブルにある場合でもどこ、あなたの最初の例で使用した場合、Region
ありますNULL
。
ANSI_NULLS
がオンの場合(オンにしないオプションは将来削除されるため、とにかく常にオンに設定する必要があります)、(少なくとも)オペランドの1つがNULL
3番目の論理値を生成する比較操作- 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
、結果はNULL
1になります。NULL
NULL
ANSI_NULLS
がに設定されている場合OFF
、NULL
比較の結果NULL
はTRUE
です。
値以外と比較するNULL
と、NULL
常にFALSE
2になります。
ただし、1と2の両方が正しくありませんUNKNOWN
。両方の比較の結果はです。
*このテキストの不可解な意味は、数年後にようやく発見されました。実際の意味は、これらの比較では、設定は効果がなく、常に設定がオンであるかのように機能するということです。それがSET ANSI_NULLS OFF
影響を及ぼさなかった設定であると述べていたら、もっと明確だっただろう。