⭐【教學】SQL 查詢為什麼抓不到 NULL?一篇搞懂 is null / is not null 正確用法!

在資料庫查詢時,你可能曾經寫過類似這樣的 SQL:

select * from my_table where status != null;

但神奇的是──
永遠查不到任何資料!
明明資料庫裡就有欄位是空值(NULL),SQL 卻裝作「看不見」。

為什麼會這樣?
這不是你寫錯,而是 SQL 的 NULL 無法用 = 或 != 比較

這篇文章會用生活化方式解釋這個問題,並帶你快速掌握正確的 NULL 查詢方式。


🍀 什麼是 NULL?為什麼不能比較?

在資料庫中:

  • 0 是數字

  • ''(空字串)是文字只是空

  • NULL 則是 未知的值、不存在的值

因此 SQL 沒辦法判斷:

NULL 是否「等於」什麼? NULL 是否「不等於」什麼?

就好像問:

“不知道的東西,不等於 1 嗎?”
“不知道的東西,不等於 空字串嗎?”


資料庫會回答:

我不知道,所以我不能說 true,也不能說 false。


所以像這樣的寫法:

where name = null;
where name != null;

永遠都不會成立。


✔ 正確查詢 NULL 的方式(唯一方法)

SQL 有專門針對 NULL 的語法:

✔ 找出為 NULL 的資料

select * from my_table where status is null;

✔ 找出不是 NULL 的資料

select * from my_table where status is not null;

這兩個語法才是查詢空值的正確方式。


🧪 實際案例:查詢某欄位不為空

假設你有一張訂單資料表 orders,想找出有填備註(remark)的訂單:

select * from orders where remark is not null;

如果 remark 欄位有內容(像是 “請加辣”),就會被查出來。


⚠ 補充:Oracle 中空字串也會變成 NULL

如果你使用 Oracle 資料庫,你可能會注意到:

remark = ''

雖然表面上看起來是空字串,Oracle 會自動把它轉成:

remark = NULL

這是 Oracle 的特性,其他資料庫(如 MySQL、SQL Server)不會這樣做。


🎯 常見錯誤案例(你一定遇過)

❌ 錯誤寫法(永遠查不到)

where status != null;

❌ 用引號錯誤(單雙引號混用)

where version = 'ABC_202501" -- 錯誤

✔ 正確寫法

where version = 'ABC_202501' and status is not null;

🔍 小技巧:想檢查某欄位到底有沒有 NULL?

你可以用 count(*) 看看:

select count(*) from orders where remark is null;

或是:

select count(*) from orders where remark is not null;

非常適合快速確認資料是否真的有值。


📝 總結

問題 正解
NULL 可以用 = 比較嗎? ❌ 不行
NULL 可以用 != 比較嗎? ❌ 不行
查 NULL 要用什麼? is null
查非 NULL 用什麼? is not null
Oracle 中空字串會變成? ✔ NULL

🎉 結語

SQL 的 NULL 是許多人在剛開始接觸資料庫時最容易搞不清楚的一環。
但只要記住這一句:

查 NULL 一律用 IS NULL / IS NOT NULL,其他都不會動。


就能避免大部分查不到資料的問題。

如果你還想學更多 SQL 查詢技巧、資料庫最佳化方法,也可以留言告訴我,我會為你寫更多簡單易懂的教學!

留言

這個網誌中的熱門文章

🔍Vue.js 專案錯誤排查:解決 numericFields is not defined 與合併儲存格邏輯最佳化

🖥️遠端桌面連線完整新手指南:Windows RDP、Chrome Remote Desktop、AnyDesk、TeamViewer 一次搞懂

🔎EF Core 連 Oracle 出現 ORA-00600 [kpp_concatq:2] 的完整排錯指南(含 EF Core ToString/CultureInfo 錯誤)