了解 SQL 中 NULL 值和 NOT IN
子句的意外行為
當 NULL
值與 NOT IN
運算子互動時,SQL 查詢通常會產生令人驚訝的結果。 當將 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
值的查詢中出現意外結果。 這凸顯了理解 NULL
SQL 處理以獲得準確查詢結果的重要性。
以上是為什麼 NULL 值會導致 SQL 的 NOT IN 子句出現意外結果?的詳細內容。更多資訊請關注PHP中文網其他相關文章!