web-dev-qa-db-ja.com

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

定義によると:

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

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

SELECT Region
FROM employees
WHERE Region = @region

または、ANSI_NULLsはこのようなクエリのみに関係しますか(WHEREには特定のWord NULLが含まれます)?

SELECT Region
FROM employees
WHERE Region = NULL
75
Rodniko

最初の例で@regionNULLである場合、RegionNULLである行がテーブルにある場合でも、行は返されません。

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

UNKNOWN値は、まだ決定されていない場合(たとえば、ANDオペランドを使用するFALSE、またはORオペランドを使用するTRUE)、または否定(NOT)を結合するブール演算子を介して伝搬します。

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


@ user1227804の answer には次の引用が含まれます。

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

from 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行を返します。したがって、両方のオペランドが列であっても、NULLNULLと等しくありません。そして、 =のドキュメント には、オペランドについて何も言うことがありません:

2つのNULL式を比較する場合、結果はANSI_NULLS設定に依存します。

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

ANSI_NULLSOFFに設定されている場合、NULLNULLと比較した結果はTRUEです。

NULLNULL以外の値と比較すると、常にFALSEになります2

ただし、両方 1 そして 2 正しくない-両方の比較の結果はUNKNOWNです。


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

58

@Regionnullの値でない場合(@Region = 'South'と言います)、ANSI_NULLSの値に関係なく、Regionフィールドがnullの行を返しません。

ANSI_NULLSは、@Regionの値がnullである場合、つまり最初のクエリが本質的に2番目のクエリになる場合にのみ違いを生じます。

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

5
SWeko

ANSI_NULLSをオンに設定

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

ANSI_NULLSをオフに設定

列にヌル値が含まれる場合に終了します

2
Joseph Stalin

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 !
0
Prasanth V J

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

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

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

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

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