SQL の NULL 値と NOT IN
句の予期しない動作を理解する
SQL クエリは、NULL
値が NOT IN
演算子と相互作用する場合に、しばしば驚くべき結果を生成します。 この矛盾は、NOT IN
クエリと、LEFT JOIN
.
次のクエリを考えてみましょう:
<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 データベースが NULL
値を処理する方法にあります。
ANSI_NULLS
が有効になっている場合 (SQL Server 2005 などの多くのシステムのデフォルト)、NULL
などの 3 = NULL
を含む比較はすべて UNKNOWN
と評価されます。この不確実性は、NULL
に固有の不確実性から生じます。
クエリ B では、NOT IN
演算子がサブクエリで NULL
に遭遇し、UNKNOWN
評価が行われます。 他に一致する値がないため、述語全体が UNKNOWN
となり、空の結果セットが生成されます。
逆に、ANSI_NULLS
を無効にすると動作が変わります。 ANSI_NULLS
がオフの場合、3 = NULL
は TRUE
と評価されます。 SQL は、NULL
をそれ自体を含むすべてのものと潜在的に等しいものとして解釈します。 その結果、クエリ B の述語は TRUE
と評価され、結果
要するに、一貫性のない結果は、NULL
設定によって決定される ANSI_NULLS
値の処理が異なることに起因します。 ANSI_NULLS
がオンの場合、NULL
との比較で UNKNOWN
が生成され、NOT IN
と NULL
の値を使用するクエリで予期しない結果が発生します。 これは、正確なクエリ結果を得るために、SQL での NULL
処理を理解することの重要性を強調しています。
以上がSQL の NOT IN 句で NULL 値が予期しない結果を引き起こすのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。