2016-01-13 83 views
0

需要一點幫助。我正在運行一個選擇的存儲過程調用。 (我不能把在實際的選擇,由於業務上的限制,但我會給你一個虛擬場景。)如果參數值爲空或空白,如何在where子句中跳過條件檢查?

下面是一個存儲過程:

Procedure checkData (name IN VARCHAR2, vehicle IN VARCHAR2, retval OUT VARCHAR2, retdata OUT returnData) 

它裏面選擇從一個文本框中輸入域獲得值用於搜索。選擇是這樣的,

select * 
from myTable tab 
WHERE tab.vehicle = vehicle 
    AND tab.name = name 

現在是什麼的問題是當用戶指定唯一一個出上述2的值,因爲它試圖基於AND條件檢查的詳細信息,搜索失敗

例如,如果用戶只提供車輛價值,比如說'BMW',那麼結果應該包含車輛的所有條目。但是,由於用戶未提供名稱值,因此它會將其作爲''或null,並且查詢不會返回任何內容,因爲它沒有找到任何匹配name = ''條件的數據。

於是,我就在下面,

select * 
from myTable tab 
WHERE tab.vehicle = vehicle 
AND IF name IS NOT NULL OR name != '' 
tab.name = name 

,但它說,

ORA-00920:無效的關係運算符。

那麼我能做些什麼來跳過第二次檢查,如果name的值是null或''。在這種情況下,我只想跳過第二次檢查並僅根據車輛值返回結果。

我不能使用OR條件,因爲當兩個參數都可用時,我也需要獲得完全匹配。我正在使用Oracle DB。

任何幫助表示讚賞。非常感謝。

+0

把一些(1)調試我來了之後就知道該值不爲空其實。它始終以''(空白/空) – WebNoob

+0

'varchar2'在Oracle數據庫中空字符串與'null'相同。目前還不清楚你的意思是不是空白,而是空白/空白。這是在客戶端應用程序? –

+0

對不起,我感到困惑。但問題現在已經解決了。下面是我用它來工作,'select * from myTable tab WHERE tab.vehicle = vehicle AND tab.name like'%'|| UPPER(name)||'%'' – WebNoob

回答

-1

試試這個。

SELECT * FROM myTable tab 
WHERE tab.vehicle=vehicle 
AND IFNULL(tab.name,1) = IF(tab.name IS NULL,1, name) 
0

假設列車輛和名稱在表中始終不爲空,你可以嘗試這樣的事:

select * 
from myTable tab 
WHERE nvl(vehicle, tab.vehicle) = tab.vehicle 
    AND nvl(name, tab.name) = tab.name 
相關問題