2016-08-01 27 views
1

我傳遞3個參數到我的Hana存儲過程中作爲WHERE子句使用,如果參數爲空,我希望該過程的行爲就像那裏沒有'不存在。SQL:SAP哈納如果參數爲空,忽略其中

示例:

如果其中一個輸入參數是deviceType。

SELECT TOP 5 DISTINCT USERS FROM MYTABLE 
WHERE USERDEVICE = deviceType; 

如果設備類型爲null,查詢應該簡單地

SELECT TOP 5 DISTINCT USERS FROM MYTABLE. 

我知道if語句我能做到這一點,但有另一種方式做到這一點?

+1

這通常使用動態SQL(不太推薦用於時間關鍵型查詢和/或高度頻繁的執行)來完成。你建立你的查詢作爲一個字符串(包括條件,如果參數傳遞),然後執行它(檢查我的MS-SQL的確切語法)。 – FDavidov

回答

1

當使用SQLScript您可以使用APPLY_FILTER()函數。

E.g.

drop procedure getTopUsers; 
create procedure getTopUsers (IN filter_cond NVARCHAR(200)) as 
begin 

    vUsers = SELECT DISTINCT user_name, creator FROM USERS; 

    if (:filter_cond is NULL) then 
    TopUsers = select TOP 5 user_name FROM :vUsers; 
    else 
    tTopUsers = APPLY_FILTER(:vUsers, :filter_cond); 
    TopUsers = SELECT TOP 5 user_name FROM :tTopUsers; 
    end if; 

    SELECT user_name FROM :TopUsers; 
end; 



call getTopUsers ('CREATOR != ''SYS'' '); 
call getTopUsers (NULL); 
-1
DECLARE @deviceType VARCHAR(100) 
DECLARE @SQL VARCHAR(256) 
    ,@sql1 VARCHAR(256) = 'WHERE USERDEVICE = ''' + @deviceType + '''' 

SET @SQL = 'SELECT TOP 5 DISTINCT USERS FROM MYTABLE' 
SET @SQL = CASE 
     WHEN @deviceType IS NULL 
      THEN @SQL 
     ELSE @SQL + ' ' + @sql1 
     END 

EXEC (@SQL) 
+0

我沒有給@deviceType參數賦值參數default是null,所以如果你想用值來檢查你可以分配值 – brahmareddy

+1

上面是MS SQL Server的T-SQL語法,並且在SAP HANA上不起作用 –

0

基本上,要求是不適用任何條件是deviceType IS NULL。相反,動態改變的查詢,你可以只構建一個總是在這種情況下,通過使用邏輯or運算符返回true的條件:

SELECT TOP 5 DISTINCT USERS 
FROM MYTABLE 
WHERE deviceType IS NULL OR USERDEVICE = deviceType;