SQL: SAP Hana 如果参数为空,忽略哪里
SQL: SAP Hana if parameter is null, ignore where
我将 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 语句实现此目的,但还有其他方法吗?
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)
基本上,要求是不应用任何条件 deviceType IS NULL
。您可以通过使用逻辑 or
运算符构造一个在这种情况下始终 returns 为真的条件,而不是动态更改查询:
SELECT TOP 5 DISTINCT USERS
FROM MYTABLE
WHERE deviceType IS NULL OR USERDEVICE = deviceType;
使用 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);
我将 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 语句实现此目的,但还有其他方法吗?
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)
基本上,要求是不应用任何条件 deviceType IS NULL
。您可以通过使用逻辑 or
运算符构造一个在这种情况下始终 returns 为真的条件,而不是动态更改查询:
SELECT TOP 5 DISTINCT USERS
FROM MYTABLE
WHERE deviceType IS NULL OR USERDEVICE = deviceType;
使用 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);