Sql-Server

當集合為空時如何理解“NULL NOT IN”?

  • August 2, 2019

這個問題中的 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 ;

給一行(再次正確)。

引用自:https://dba.stackexchange.com/questions/244148