1. ホーム
  2. sql

[解決済み] SQL Serverで、"SET ANSI_NULLS ON "は何を意味するのですか?

2023-01-08 20:29:13

質問

定義によると

SET ANSI_NULLS が ON のとき、WHERE column_name = NULL を使用する SELECT 文は、column_name に NULL 値があっても 0 行を返します。WHERE column_name <> NULL を使用する SELECT 文は、column_name に NULL 以外の値がある場合でも、0 行を返します。

このクエリにはNULLは含まれないということでしょうか?

SELECT Region
FROM employees
WHERE Region = @region

あるいは ANSI_NULL はこのようなクエリにのみ関係します (ここで WHERE には特定の単語 NULL )?

SELECT Region
FROM employees
WHERE Region = NULL

どのように解決するのですか?

以下の場合は、行が返されないことを意味します。 @regionNULL である場合、最初の例で使われたとき、たとえテーブルの中に RegionNULL .

いつ ANSI_NULLS がオンの場合 (将来的にオンのオプションは削除される予定なので、いずれにせよ常にオンに設定すべきです)、 (少なくとも) オペランドの 1 つが NULL の場合、3 番目の論理値である UNKNOWN (とは対照的に TRUEFALSE ).

UNKNOWN の値は、それらがまだ決定されていない場合、任意の組み合わせのブーリアン演算子を介して伝播します(例えば ANDFALSE オペランドまたは OR を持つ TRUE オペランド)または否定( NOT ).

WHERE 句は FROM 句の全体的な値が WHERE 節は TRUE でなければならない。ですから、もし UNKNOWN が生成された場合、その行はフィルタリングされます。


@user1227804 さんの 答え には、こんな引用があります。

<ブロッククオート

比較の両側が列または複合式の場合、この設定は比較に影響しません。

から SET ANSI_NULLS *

しかし、これが何を言いたいのかよくわかりません。 NULL カラムが比較される場合 (たとえば JOIN のように)、比較はまだ失敗します。

create table #T1 (
    ID int not null,
    Val1 varchar(10) null
)
insert into #T1(ID,Val1) select 1,null

create table #T2 (
    ID int not null,
    Val1 varchar(10) null
)
insert into #T2(ID,Val1) select 1,null

select * from #T1 t1 inner join #T2 t2 on t1.ID = t2.ID and t1.Val1 = t2.Val1

上記のクエリは0行を返しますが、一方で

SELECT * FROM #T1 t1 INNER JOIN #T2 t2 
   ON t1.ID = t2.ID 
  AND (   t1.Val1 = t2.Val1 
       OR t1.Val1 IS NULL 
      AND t2.Val1 IS NULL   )

1行を返します。そのため、オペランドが両方とも列の場合でも NULL とは等しくなりません。 NULL . また のドキュメントでは = にはオペランドについて何も書かれていません。

二つの NULL の式を比較するとき、その結果は ANSI_NULLS の設定に依存します。

もし ANSI_NULLS が設定されている場合は ON に設定すると、結果は NULL 1 という ANSI 規約に従って NULL (または未知) の値は別の NULL または未知の値と等しくない。

もし ANSI_NULLS が設定されている場合は OFF の結果は NULL と比較すると NULLTRUE .

比較する NULL を非 NULL の値は常に FALSE 2 .

しかし、両方の 1 2 は不正確です。両方の比較の結果は UNKNOWN .


* この文章の不可解な意味は、数年後にようやく発見された。実際の意味は、それらの比較のために、設定は何の効果もなく 常に設定が ON であるかのように動作する . と記述されていれば、より明確だったでしょう。 SET ANSI_NULLS OFF は何の効果もない設定であることを明記していれば、より明確でした。