Oracle 當輸入參數允許為空時


場景:

有一個存儲過程p_test 帶有多個輸入參數code、name、number

p_test(code IN VARCHAR2,nameIN VARCHAR2,number IN VARCHAR2,resultList OUT sys_refcursor)

但是業務上要求這三個參數都允許為空,也就是都不是必填項

 

原本sql語句是寫成這樣的:

select * from temptbl a where a.code=code and a.name=name and a.number=number

 

設想:

一開始想到的是分別對每個參數進行空值判斷,然后拼接sql,不為空的參數就寫到where條件里去。但是對於簡單的sql好說,對於復雜的sql不太可行,這樣做代碼會很亂。

 

結論:

 

百度后找到一個很有用的函數叫COALESCE(表達式1,表達式2,.....,表達式n)

它的作用是返回多個表達式中第一個非null的值,從左到右找尋,找到后即停止尋找並返回該非null值。

例子:coalesce(null,2,3)  返回值為:2  

當然參數中的2和3也可寫成表示式,如3+3、4+5之類的。或者其他數據類型。

回到剛剛的問題,此問題可以結合coalesce函數和like完成(或許還有更好的辦法不過我現在只想到這個)

sql語句可以改為:

select * from temptbl a where a.code like coalesce(code,'%%') and a.name like coalesce(name,'%%') and a.number like coalesce(number,'%%')

那么當輸入參數code為null時條件就變成a.code like '%%',即不限制a.code的值(不過a.code為null的值會過濾掉,如果實際業務要展示null值,需另行判斷);當輸入參數code不為null時條件就變成a.code like code,由於未加通配符,此查詢等同於a.code=code。其他參數依次類推。


免責聲明!

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



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