Oracle|NOT IN 條件查詢【坑】

劇情還原:

上週投產之後同事應該在某個頁面查詢的時候新增了一個not in的條件,結果導致列表部分數據不展示了,經排查發現原來是not in條件的問題。

問題復現:

1.基礎數據: 共10條數據 狀態爲空-1條 已作廢-4條 報告審批-5條

select * from v_safe_testengineer v where v.vst_tester ='w07387';

在這裏插入圖片描述

2.新增not in ‘已作廢’條件之後:共5條數據 報告審批-5條 什麼情況?狀態爲空的數據怎麼不見了?

select * from v_safe_testengineer v where v.vst_tester ='w07387' and v.vst_note not in '已作廢';

在這裏插入圖片描述

預期結果:共6條數據 狀態爲空-1條 報告審批-5條

解決方案:

3.改進SQL之後:與預期結果一直

select * from v_safe_testengineer v where v.vst_tester ='w07387' and (v.vst_note not in '已作廢' or v.vst_note is null );

在這裏插入圖片描述
ps:這種方案也能解決該問題,但是大家都知道Oracle in 超過1000個參數會報 “ORA-01795: 列表中的最大表達式數爲 1000”

4.最終方案>達到預期結果

select * from v_safe_testengineer v where v.vst_tester ='w07387' 
and not exists (select a.id from v_safe_testengineer a where a.vst_tester ='w07387' and a.vst_note = '已作廢' and a.id = v.id)

在這裏插入圖片描述
結論:
大家拼接SQL條件的時候如果字段值有NULL的情況不要使用not in 這種方式,還是建議大家使用 not exists 和 exists ,相對來說效率高一點。

我是二哥(Jayla),每天總結一點點,每天進步一點點。
我是二哥(Jayla),歡迎大家關注我的公衆號:
每天總結一點點,每天進步一點點。
專注Java相關知識,每天準時分享乾貨。 SpringBoot/Oracle/Git/Linux/Mysql 期待您的加入~
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章