劇情還原:
上週投產之後同事應該在某個頁面查詢的時候新增了一個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 期待您的加入~