淺談 SQL Server WHERE 子句的 NULL 判斷
TLDR
- 在 SQL 中判斷欄位是否為
NULL,必須使用IS NULL或IS NOT NULL,使用= NULL會導致查詢結果不符合預期。 - SQL 的邏輯運算結果包含
TRUE、FALSE與UNKNOWN三種狀態。 WHERE子句僅會篩選出結果為TRUE的資料列。- 任何值(包含
NULL本身)與NULL進行比較,結果皆為UNKNOWN。 - 建議在查詢條件中盡量避免產生
UNKNOWN狀態,以確保邏輯明確。 - SQL Server 官方建議使用
<>作為不等於運算子,儘管部分環境支援!=。
NULL 的比較邏輯與 UNKNOWN 狀態
什麼情況下會遇到這個問題:當開發者嘗試使用 = 運算子來篩選資料庫中為 NULL 的欄位時。
在 SQL 中,NULL 代表「未知的值」。因此,任何值與 NULL 進行比較(例如 Column = NULL),其結果並非 TRUE 或 FALSE,而是 UNKNOWN。由於 WHERE 子句僅會回傳邏輯判斷為 TRUE 的資料列,這導致使用 = NULL 的查詢永遠無法撈出正確資料。
UNKNOWN 的邏輯運算規則
為了避免邏輯錯誤,需了解 UNKNOWN 在布林運算中的行為:
AND運算:TRUE AND UNKNOWN=UNKNOWNUNKNOWN AND UNKNOWN=UNKNOWNFALSE AND UNKNOWN=FALSE
OR運算:TRUE OR UNKNOWN=TRUEUNKNOWN OR UNKNOWN=UNKNOWNFALSE OR UNKNOWN=UNKNOWN
結論與建議
- 務必使用
IS NULL或IS NOT NULL來判斷空值。 - 避免在
WHERE條件中撰寫會產生UNKNOWN的複雜邏輯,以防查詢結果被過濾掉。
SQL Server 的不等於運算子
什麼情況下會遇到這個問題:在撰寫 SQL 查詢時,不確定該使用 <> 還是 !=。
雖然 SQL Server 支援 != 語法,但根據官方文件,<> 才是標準的 ANSI SQL 不等於運算子。為了保持程式碼的可移植性與符合標準規範,建議優先使用 <>。
- 推薦做法:使用
<>進行不等於判斷。 - 注意事項:部分舊版或特定資料庫系統(如 Microsoft Access)可能不支援
!=。
參考資料
異動歷程
- 2024-07-24 初版文件建立。
