Oracle 當輸入引數允許為空時

2021-07-10 21:25:41 字數 1003 閱讀 4516

場景:

有乙個儲存過程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。其他引數依次類推。

Oracle 當輸入引數允許為空時

場景 有乙個儲存過程p test 帶有多個輸入引數code name number p test code in varchar2,namein varchar2,number in varchar2,resultlist out sys refcursor 但是業務上要求這三個引數都允許為空,也就...

Google Protobuf 請求引數為空的案例

google protobuf已經提供了空引數 message empty使用方法,在proto檔案中匯入empty.proto,定義乙個請求引數和返回值為空的函式emptyfunction,函式名字可以自定義。import google protobuf empty.proto service p...

引數為空,選擇全部

在使用wyn enterprise 設計報表時,經常會用到查詢引數。使用者帶有引數的報表,在檢視時,未選擇引數值即可以顯示全部資料。選擇引數值後,則按照引數值過濾查詢。即引數為空,選擇全部。如下圖。實現此效果,需要在報表內嵌資料集中使用動態sql。sql寫法 select from demo 銷售明...