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 表示未知或缺失值。 它與 IN
和 NOT IN
等謂詞的交互由 ANSI_NULLS
設定控制。
啟用 ANSI_NULLS
(預設)時,涉及 NULL 的比較計算結果為 UNKNOWN,除非使用 IS NULL
或 IS NOT NULL
明確檢查。
在查詢 A 中,將 3 與包含 NULL 的清單進行比較會得到 TRUE 評估,因為存在 3。 NULL 值不會影響整體結果。
但是查詢 B 使用 NOT IN
。 由於 ANSI_NULLS
處於開啟狀態,因此由於 3 和 NULL 之間的比較,比較 3 NOT IN (1, 2, NULL)
的計算結果為 UNKNOWN。 因此,查詢傳回一個空集合。
停用ANSI_NULLS
會改變這一點。 NULL 的處理方式與任何其他值一樣。 在這種情況下,3 NOT IN (1, 2, NULL)
將計算為 TRUE,因為 3 不同於 1、2 和 NULL。 因此,查詢 B 將產生 ANSI_NULLS
關閉的結果。
這強調了在 SQL 中處理 NULL 時 ANSI_NULLS
設定的重要性。 透過管理此設置,您可以控制涉及 NULL 的謂詞行為並獲得所需的查詢結果。
以上是為什麼 SQL 中的「NOT IN」會傳回帶有 NULL 值的意外結果?的詳細內容。更多資訊請關注PHP中文網其他相關文章!