首頁 >資料庫 >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(預設)時,涉及 NULL 的比較計算結果為 UNKNOWN,除非使用 IS NULLIS 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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn