NOT IN之後的子查詢不能包含NULL值

llnnmc發表於2019-05-27

如果空值可能是子查詢結果的一部分,則不應與主查詢中的NOT IN運算子一起使用。為什麼呢?看下面例子就明白了。

NOT IN後面的子查詢有記錄為NULL,主查詢查不到記錄

select * from emp where 3 not in (1, 2, null);

未選定行

因為這個查詢可以理解為

select * from emp where 3 <> 1 and 3 <> 2 and 3 <> null;

由於NULL值不能參與比較運算子,導致條件不成立,因此查詢不出來資料。

如果是IN運算則能查到資料

select * from emp where 1 in (1, 2, null);

因為可將該查詢理解為

select * from emp where 1 = 1 or 1 = 2 or 1 = null;

雖然NULL值同樣不能做比較,但或運算的短路效應使得前面條件已成立時全盤條件即成立,因此輸出了結果。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28974745/viewspace-2645761/,如需轉載,請註明出處,否則將追究法律責任。

相關文章