ホームページ >データベース >mysql チュートリアル >SQL で「NOT IN」が NULL 値を含む予期しない結果を返すのはなぜですか?

SQL で「NOT IN」が NULL 値を含む予期しない結果を返すのはなぜですか?

Susan Sarandon
Susan Sarandonオリジナル
2025-01-23 12:36:12813ブラウズ

Why Does `NOT IN` Return Unexpected Results with NULL Values in SQL?

SQL の NOT IN 句と NULL 値のニュアンス

SQL では、特に NULL が存在する場合に、データを値セットと比較することが頻繁に問題になります。 いくつかのクエリ例を使ってこれを調べてみましょう:

<code class="language-sql">A: SELECT 'true' WHERE 3 IN (1, 2, 3, NULL);
B: SELECT 'true' WHERE 3 NOT IN (1, 2, NULL);</code>

クエリ A は結果を生成しますが、クエリ B は結果を生成しません。この動作は、SQL が NOT IN 句内の NULL を処理する方法に起因します。

SQL では、NULL は不明な値または欠損値を意味します。 INNOT IN などの述語との相互作用は、ANSI_NULLS 設定によって制御されます。

ANSI_NULLS が有効 (デフォルト) の場合、IS NULL または IS NOT NULL を使用して明示的にチェックしない限り、NULL を含む比較は UNKNOWN と評価されます。

クエリ A では、3 を NULL を含むリストと比較すると、3 が存在するため TRUE と評価されます。 NULL 値は全体的な結果には影響しません。

ただし、

クエリ B は NOT IN を使用します。 ANSI_NULLS がオンになっているため、比較 3 NOT IN (1, 2, NULL) は 3 と NULL の比較により UNKNOWN と評価されます。 その結果、クエリは空のセットを返します。

ANSI_NULLS を無効にすると、これが変更されます。 NULL は他の値と同様に扱われます。 このシナリオでは、3 は 1、2、および NULL とは異なるため、3 NOT IN (1, 2, NULL) は TRUE と評価されます。 したがって、クエリ B は ANSI_NULLS がオフの結果を返します。

これは、SQL で NULL を扱うときの ANSI_NULLS 設定の重要性を強調します。 この設定を管理することで、NULL を含む述語の動作を制御し、必要なクエリ結果を取得できます。

以上がSQL で「NOT IN」が NULL 値を含む予期しない結果を返すのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。