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 NULL
或 NOT EXISTS
,我們繞過了這種歧義並確保查詢返回預期結果。 在這種情況下,NOT EXISTS
方法通常因其改進的性能和可讀性而受到青睞。
以上是為什麼我的 SQL'NOT IN”子句不能處理 NULL 值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!