[解決済み] SQL Serverで、"SET ANSI_NULLS ON "は何を意味するのですか?
質問
定義によると
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
どのように解決するのですか?
以下の場合は、行が返されないことを意味します。
@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
*
しかし、これが何を言いたいのかよくわかりません。
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
と比較するとNULL
はTRUE
.比較する
NULL
を非NULL
の値は常にFALSE
2 .
しかし、両方の
1
と
2
は不正確です。両方の比較の結果は
UNKNOWN
.
*
この文章の不可解な意味は、数年後にようやく発見された。実際の意味は、それらの比較のために、設定は何の効果もなく
常に設定が ON であるかのように動作する
. と記述されていれば、より明確だったでしょう。
SET ANSI_NULLS OFF
は何の効果もない設定であることを明記していれば、より明確でした。
関連
-
plsql-stored-procedure ORA-06550 エラー処理
-
[解決済み] SQL ServerでSELECTからUPDATEする方法とは?
-
[解決済み] SQL Server で複数行のテキストを 1 つのテキスト文字列に連結する方法
-
[解決済み] SQL Server テーブルにカラムが存在するかどうかを確認する方法は?
-
[解決済み] SQL Server の DateTime データ型から日付だけを返す方法
-
[解決済み] SQL ServerにおけるLEFT JOINとLEFT OUTER JOINの比較
-
[解決済み] SQL ServerでJOINを使用してUPDATE文を実行するにはどうすればよいですか?
-
[解決済み] SQL Server - 挿入された行のIDを取得するための最良の方法は?
-
[解決済み] SQL Serverにおける関数とストアドプロシージャの比較
-
[解決済み】SQL Serverで既存のテーブルにデフォルト値を持つカラムを追加する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
MHAの高可用性構成とフェイルオーバー
-
windows mysql prompt access denied for user ''@'localhost' to database.
-
[解決済み] SQLのカラム名があいまいな場合のクエリエラー
-
[解決済み] UNIONとUNION ALLの違いは何ですか?
-
[解決済み] SQL SELECT WHERE フィールドに単語が含まれる場合
-
[解決済み] MySQLでFULL OUTER JOINを行うにはどうすればよいですか?
-
[解決済み] SQL Serverで結果をページ分割する最も良い方法は何ですか?
-
[解決済み] DISTINCTでCOUNT(*)を選択する
-
[解決済み] 既存のカラムにIDを追加する
-
[解決済み] SQL Serverで、ある日付より大きいすべての日付を照会するにはどうすればよいですか?