注:Sushant Buttaの回答で外部リンクが無効であると誰かが主張したため、別の回答としてここにコンテンツを投稿しました。
NULLSに注意してください。
今日、INとNOT IN
演算子を使用しているときに、クエリの非常に奇妙な動作に遭遇しました。実際、2つのテーブルを比較table b
して、からの値がに存在するかどうかtable a
を調べ、列にnull
値が含まれている場合の動作を調べたいと思いました。そこで、この動作をテストするための環境を作成しました。
テーブルを作成しますtable_a
。
SQL> create table table_a ( a number);
Table created.
テーブルを作成しますtable_b
。
SQL> create table table_b ( b number);
Table created.
にいくつかの値を挿入しtable_a
ます。
SQL> insert into table_a values (1);
1 row created.
SQL> insert into table_a values (2);
1 row created.
SQL> insert into table_a values (3);
1 row created.
にいくつかの値を挿入しtable_b
ます。
SQL> insert into table_b values(4);
1 row created.
SQL> insert into table_b values(3);
1 row created.
次に、クエリを実行して、演算子table_a
をtable_b
使用して値をチェックすることにより、の値の存在をチェックしますIN
。
SQL> select * from table_a where a in (select * from table_b);
A
3
以下のクエリを実行して、存在しないことを確認します。
SQL> select * from table_a where a not in (select * from table_b);
A
1
2
出力は期待どおりになりました。次にnull
、テーブルに値を挿入しtable_b
、上記の2つのクエリがどのように動作するかを確認します。
SQL> insert into table_b values(null);
1 row created.
SQL> select * from table_a where a in (select * from table_b);
A
3
SQL> select * from table_a where a not in (select * from table_b);
no rows selected
最初のクエリは期待どおりに動作しましたが、2番目のクエリはどうなりましたか?なぜ出力が得られなかったのですか、何が起こったのでしょうか?クエリに違いはありますか?いいえ。
変更はテーブルのデータにありますtable_b
。null
表に値を導入しました。しかし、なぜそれがこのように動作しているのですか?2つのクエリを"AND"
と"OR"
演算子に分割してみましょう。
最初のクエリ:
最初のクエリは、このような内部で処理されます。だから、null
私の最初の2つのオペランドがどちらかに評価するとして、ここで問題を作成しませんtrue
かfalse
。しかし、私の3番目のオペランドa = null
は評価true
もfalse
。もしません。null
のみに評価されます。
select * from table_a whara a = 3 or a = 4 or a = null;
a = 3 is either true or false
a = 4 is either true or false
a = null is null
2番目のクエリ:
2番目のクエリは次のように処理されます。"AND"
演算子を使用しているためtrue
、どのオペランド以外でも出力は得られません。
select * from table_a whara a <> 3 and a <> 4 and a <> null;
a <> 3 is either true or false
a <> 4 is either true or false
a <> null is null
では、これをどのように処理するのでしょうか。演算子を使用しながらnot null
、テーブルからすべての値を選択します。table_b
NOT IN
SQL> select * from table_a where a not in (select * from table_b where b is not null);
A
1
2
したがってNULL
、NOT IN
演算子を使用するときは、列の値に常に注意してください。
NULLに注意してください!!
in
文は同じように解析されますfield=val1 or field=val2 or field=val3
。そこにnullを入れると、結局field=null
は機能しません。