1

我将 3 个参数传递给我的 Hana 存储过程以用作WHERE子句,如果参数是null,我希望该过程表现得好像该条件不存在一样。

例子:

如果输入参数之一是deviceType.

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

如果 deviceType 为 null,则查询应为

SELECT TOP 5 DISTINCT USERS FROM MYTABLE.

我知道我可以使用 if 语句来实现这一点,但还有其他方法吗?

4

3 回答 3

2

基本上,要求是不适用任何条件deviceType IS NULL。除了动态更改查询之外,您还可以使用逻辑运算符构造一个在这种情况下始终返回 true 的条件or

SELECT TOP 5 DISTINCT USERS 
FROM   MYTABLE
WHERE  deviceType IS NULL OR USERDEVICE = deviceType;
于 2016-08-01T06:12:11.170 回答
1

使用 SQLScript 时,您可以使用 APPLY_FILTER() 函数。

例如

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);
于 2016-08-01T06:13:06.923 回答
-2
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)
于 2016-08-01T06:01:59.077 回答