oracle 子查詢中null的問題(in 和 not in)


先看一下員工表:

SELECT * FROM p_emp e 



例子:查詢員工表中不是領導的員工

按正常邏輯思維:SQL語句應該為:

SELECT * FROM p_emp e WHERE e.empno NOT IN (SELECT mgr FROM p_emp)


但是輸出結果為空,沒有返回值

再看:

SELECT * FROM p_emp e WHERE e.empno IN (SELECT mgr FROM p_emp)

這里有返回值

這里的in后面的句子可以理解為or拼接,簡單舉例即

in (9566,9839,null)可以等價於mgr=9566 or mgr=9839 or mgr=null,

not in (9566,9839,null)可以等價於not(mgr=9566 or mgr=9839 or mgr=null)或mgr!=9566 and mgr!=9839 and mgr!=null。

為什么都是or拼接,in可以而not in不可以呢,可以把not in理解為后面的and表達式就知道了,因為mgr=null為null,也就相當於false,導致整個表達式為false,無論傳何值都為false,自然無法返回數據。

當發現not in后的子查詢后面有null值時,可以在子查詢里用is not null或函數過濾null值。

 所以,最后的SQL語句應該為:

SELECT * FROM p_emp e WHERE e.empno NOT IN (SELECT mgr FROM p_emp WHERE mgr IS NOT NULL)


這些即為員工表中不是領導的員工

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM