Sql-Server
當集合為空時如何理解“NULL NOT IN”?
這個問題中的 SQL 是針對 Oracle 的。但是您可以簡單地刪除
FROM dual
以使其在 SQL Server 上工作(返回與 Oracle 相同的結果)。我有以下 SQL:
SELECT 1 FROM dual WHERE NULL IN (SELECT 1 FROM dual WHERE 1 = 0); SELECT 1 FROM dual WHERE NULL NOT IN (SELECT 1 FROM dual WHERE 1 = 0);
它分別返回一個空集和 1。當我們用其他值代替 時
NULL
,我們得到了完全相同的結果。SELECT 1 FROM dual WHERE 33 IN (SELECT 1 FROM dual WHERE 1 = 0); SELECT 1 FROM dual WHERE 33 NOT IN (SELECT 1 FROM dual WHERE 1 = 0);
那麼這裡 NULL 和空結果集之間的比較是如何工作的呢?
讓我們看看這兩種情況會發生什麼:
WHERE NULL IN (SELECT 1 FROM dual WHERE 1 = 0); WHERE NULL NOT IN (SELECT 1 FROM dual WHERE 1 = 0);
由於子查詢產生一個空表,我們可以用虛擬碼編寫它們:
WHERE NULL IN (<empty_table>); WHERE NULL NOT IN (<empty_table>);
所以第一個詢問是否某個(NULL)值在空表中。這種條件的結果總是
FALSE
,與值是否為空無關,因為表是空的。在第二個條件中應用相同的推理,它總是
TRUE
,再次獨立於值。在 Postgres 中很容易確認這些條件的結果值是什麼,因為我們有一個布爾類型。請參閱dbfiddle.uk,其中第一個顯示
f
(FALSE),第二個顯示t
(TRUE)。由於上述原因,當您執行兩個查詢時,它們變為:
SELECT 1 FROM dual WHERE FALSE ;
給出一個空結果(正確,因為
WHERE
條件是FALSE
)和
SELECT 1 FROM dual WHERE TRUE ;
給一行(再次正確)。