首頁 >資料庫 >mysql教程 >為什麼我的 SQL'NOT IN”子句不能處理 NULL 值?

為什麼我的 SQL'NOT IN”子句不能處理 NULL 值?

Susan Sarandon
Susan Sarandon原創
2025-01-18 11:21:09434瀏覽

Why Doesn't My SQL `NOT IN` Clause Work with NULL Values?

SQL 的 NOT IN 子句與 NULL 值故障排除

本文解決了在 SQL 查詢中使用 NOT IN 子句時遇到的常見問題:由於 NULL 值導致結果集意外為空。 此場景涉及從 Stock 表(在 Inventory 資料庫中)選擇 Products 表(在 Subset 資料庫中)中不存在的記錄。

NOT IN 表中的 foreignStockId 欄位包含 NULL 值時,Products 子句無法如預期運作。 即使 NOT IN 子查詢的結果集中存在一個 NULL,也會導致整個查詢不傳回任何行。

解:

為了修正這個問題,我們需要明確排除 NULL 值。提出了兩種有效的方法:

1。 使用IS NOT NULL

此方法從 NOT IN 子查詢中過濾掉 NULL:

<code class="language-sql">SELECT stock.IdStock, stock.Descr
FROM   [Inventory].[dbo].[Stock] stock
WHERE  stock.IdStock NOT IN (SELECT foreignStockId
                             FROM   [Subset].[dbo].[Products]
                             WHERE  foreignStockId IS NOT NULL);</code>

2。 使用NOT EXISTS

NOT EXISTS 子句提供了更有效率且通常更清晰的替代方案:

<code class="language-sql">SELECT stock.idstock, stock.descr
FROM   [Inventory].[dbo].[Stock] stock
WHERE  NOT EXISTS (SELECT *
                   FROM   [Subset].[dbo].[Products] p
                   WHERE  p.foreignstockid = stock.idstock);</code>

理解問題:三值邏輯

SQL 採用三值邏輯:True、False 和 Unknown。 WHERE 子句的計算結果必須為 True 才能將行包含在結果集中。 出現此問題是因為 'A' <> NULL 的計算結果為 Unknown。 當 Unknown 比較中存在 NOT IN 時,整個表達式將變為 Unknown,產生空結果集。

範例:

考慮這個:

Predicate True False Unknown
'A' NOT IN ('X','Y',NULL) True True Unknown

Unknown 結果源自於 'A' 與 NULL 的比較。 因此,整個 WHERE 子句的計算結果為 Unknown,且不傳回任何行。

透過使用 IS NOT NULLNOT EXISTS,我們繞過了這種歧義並確保查詢返回預期結果。 在這種情況下,NOT EXISTS 方法通常因其改進的性能和可讀性而受到青睞。

以上是為什麼我的 SQL'NOT IN”子句不能處理 NULL 值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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