1. ホーム
  2. sql

[解決済み】NOT IN句の中のNULL値

2022-04-01 12:22:20

質問

この問題は、同じクエリだと思ったのにレコード数が異なる場合、1つのクエリで not in where という制約があり、もう一方は left join . のテーブルは not in 制約に 1 つの NULL 値 (不良データ) があったため、このクエリは 0 レコードのカウントを返しました。理由はなんとなくわかっているのですが、この概念を完全に理解するために、いくつかの助けを借りたいのです。

簡単に言うと、なぜクエリーAは結果を返し、Bは返さないのでしょうか?

A: select 'true' where 3 in (1, 2, 3, null)
B: select 'true' where 3 not in (1, 2, null)

これは、SQL Server 2005での話です。また set ansi_nulls off は、Bが結果を返すようになります。

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

クエリAは

select 'true' where 3 = 1 or 3 = 2 or 3 = 3 or 3 = null

以降 3 = 3 が真であれば、結果を得ることができます。

クエリーBは、同じように

select 'true' where 3 <> 1 and 3 <> 2 and 3 <> null

いつ ansi_nulls がオンになっている。 3 <> null はUNKNOWNなので、述語はUNKNOWNと評価され、行を取得することはできません。

いつ ansi_nulls がオフの場合。 3 <> null が真であれば、述語は真と評価され、行を得ることができます。