SQL Serverでは、「SETANSI_NULLSON」とはどういう意味ですか?


92

定義は言う:

SET ANSI_NULLSがONの場合、WHERE column_name = NULLを使用するSELECTステートメントは、column_nameにNULL値がある場合でも、ゼロ行を返します。WHERE column_name <> NULLを使用するSELECTステートメントは、column_nameにNULL以外の値がある場合でも、ゼロ行を返します。

これは、このクエリにnullが含まれないことを意味しますか?

SELECT Region
FROM employees
WHERE Region = @region

またはANSI_NULL、このようなクエリ(にWHERE特定の単語が含まれている場合NULL)のみが関係しますか?

SELECT Region
FROM employees
WHERE Region = NULL

1
最初の段落をコピーした公式ドキュメントの4番目の段落には、まだ答えがありませんか。->「SETANSI_NULLS ONは、比較のオペランドの1つがNULLの変数である場合にのみ、比較に影響します。またはリテラルNULL。比較の両側が列または複合式の場合、設定は比較に影響しません。」
user1451111 2018年

回答:


68

それは場合は行が返されないことを意味し@regionているNULL行がテーブルにある場合でもどこ、あなたの最初の例で使用した場合、RegionありますNULL

ANSI_NULLSがオンの場合(オンにしないオプションは将来削除されるため、とにかく常にオンに設定する必要があります)、(少なくとも)オペランドの1つがNULL3番目の論理値を生成する比較操作- UNKNOWNTRUEおよびとは対照的にFALSE)。

UNKNOWN彼らはすでに(例えば決まっていない場合の値は、任意の組み合わせブール演算子を介して伝播ANDしてFALSEオペランドまたはORTRUEオペランド)または否定(NOT)。

WHERE句により生成された結果セットをフィルタリングするために使用されるFROM句を、全体の値ようにWHERE節がなければならないTRUE行について除外されないように。したがって、UNKNOWN比較によってが生成された場合、行は除外されます。


@ user1227804の回答には、次の引用が含まれています。

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

から SET ANSI_NULLS*

ただし、2つの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。そして、のドキュメントに=は、オペランドについて何も言うことはありません。

2つのNULL式を比較すると、結果はANSI_NULLS設定によって異なります。

ANSI_NULLSがに設定されている場合、(または不明な)値が別の値または不明な値と等しくないというANSI規則に従ってON、結果はNULL1になります。NULLNULL

ANSI_NULLSがに設定されている場合OFFNULL比較の結果NULLTRUEです。

値以外と比較するNULLと、NULL常にFALSE2になります。

ただし、12の両方が正しくありませんUNKNOWN。両方の比較の結果はです。


*このテキストの不可解な意味は、数年後にようやく発見されました。実際の意味は、これらの比較では、設定は効果がなく、常に設定がオンであるかのように機能するということです。それがSET ANSI_NULLS OFF影響を及ぼさなかった設定であると述べていたら、もっと明確だっただろう。


1
だから私があなたを正しく理解しているなら:それは私が特に「WhereRegion = null」と書いたときだけでなく、「Where Region = @region」フレーズの結果にも影響しますか?
ロドニコ2012年

7

場合@Regionではないnull(発言権をすることができます値@Region = 'South')地域フィールドがヌルであるところ、それは関係なく、ANSI_NULLSの値を、行を返しません。

ANSI_NULLSは、の値@Regionnullである場合、つまり最初のクエリが基本的に2番目のクエリになる生じます。

その場合、ANSI_NULLS ONは行を返しません(null = null不明なブール値(別名null)を生成するため)。ANSI_NULLSOFFは、Regionフィールドがnullである行を返します(null = nullを生成するためtrue)。


6

ANSI_NULLSが "ON"に設定されていて、selectステートメントの書き込み中にNULL列の値に=、<>を適用すると、結果は返されません。

create table #tempTable (sn int, ename varchar(50))

insert into #tempTable
values (1, 'Manoj'), (2, 'Pankaj'), (3, NULL), (4, 'Lokesh'), (5, 'Gopal')

ANSI_NULLSをオンに設定

select * from #tempTable where ename is NULL -- (1 row(s) affected)
select * from #tempTable where ename = NULL -- (0 row(s) affected)
select * from #tempTable where ename is not NULL -- (4 row(s) affected)
select * from #tempTable where ename <> NULL -- (0 row(s) affected)

ANSI_NULLSをオフに設定

select * from #tempTable where ename is NULL -- (1 row(s) affected)
select * from #tempTable where ename = NULL -- (1 row(s) affected)
select * from #tempTable where ename is not NULL -- (4 row(s) affected)
select * from #tempTable where ename <> NULL -- (4 row(s) affected)

2
とを明確に区別する唯一の回答でWHERE X IS NULLありWHERE X = NULL、ANSI_NULLSが結果にどのように影響するかについては+1 。熱心な反対票の試みにもかかわらず、これは受け入れられた答えであるはずです!
RiegardtSteyn19年

1
例を使用して説明するための+1。これは、長い文ではなく、常に明確で簡潔になります。
peter.aryanto

3

ANSI_NULLSをオンに設定

ITテーブル内のnull値を含むすべての値を返します

ANSI_NULLSをオフに設定

列にNULL値が含まれると終了します


2
この回答は、すでに述べた回答にどのような追加を追加しますか?古い質問に新しい回答を追加することには注意してください-すでに投稿されたソリューションに関する詳細な説明を含めるか、新しい洞察を提供する必要があります-レビューから
タカリ2017

1

ここでの主なことは次のとおりです。

決して使用しない

  • @anything = NULL
  • @anything <> NULL
  • @anything != null

常に使用:

  • @anything IS NULL
  • @anything IS NOT NULL

0

ANSI NULLS OFFを設定すると、NULL = NULL比較がtrueを返します。EG:

        SET ANSI_NULLS OFF
        select * from sys.tables
        where principal_id = Null

以下に示すような結果が返されます。zcwInvoiceDeliveryType744547NULLzcExpenseRptStatusTrack 2099048 NULL ZCVendorPermissions 2840564 NULL ZCWOrgLevelClientFee 4322525 NULL

このクエリは結果を返しませんが:

        SET ANSI_NULLS ON 
        select * from sys.tables
        where principal_id = Null

0

https://docs.microsoft.com/en-us/sql/t-sql/statements/set-ansi-nulls-transact-sql

SET ANSI_NULLSがONの場合、WHERE column_name = NULLを使用するSELECTステートメントは、column_nameにNULL値がある場合でも、ゼロ行を返します。WHERE column_name <> NULLを使用するSELECTステートメントは、column_nameにnull以外の値がある場合でも、ゼロ行を返します。

例えば

DECLARE @TempVariable VARCHAR(10)
SET @TempVariable = NULL

SET ANSI_NULLS ON
SELECT 'NO ROWS IF SET ANSI_NULLS ON' where    @TempVariable = NULL
-- IF ANSI_NULLS ON , RETURNS ZERO ROWS


SET ANSI_NULLS OFF
SELECT 'THERE WILL BE A ROW IF ANSI_NULLS OFF' where    @TempVariable =NULL
-- IF ANSI_NULLS OFF , THERE WILL BE ROW !
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.