我已经研究了这个场景几个小时,但似乎找不到任何直接解决它的东西。
我有很多可选参数传递到存储过程中。我想返回一个没有过滤的记录集,传递给存储过程的一个或多个可选参数。
我正在尝试生成单个查询来执行此操作。
这是我的伪代码(SQL Server 2005):
declare @a varchar(10); set @a = null;
declare @b varchar(10); set @b = 'comm%';
select * from x
where (if @a is not null then col1 like @a)
and (if @b is not null then col2 like @b)
如您所见,我只想在 col1 if 我的参数 (@a) 有数据时进行过滤。同样,我只想过滤 col2 if 我的参数 (@b) 有数据。如果@a 和@b 均为 NULL,则查询应返回所有行。
我发现了几个接近我想要的线程,但它们都没有使用 LIKE 子句进行寻址。
最佳答案
你很接近 - 使用:
SELECT x.*
FROM X x
WHERE (@a IS NULL OR x.col1 LIKE @a)
AND (@b IS NULL OR x.col2 LIKE @b)
但这是 not recommended because it's not sargable . Dynamic SQL将是一个更好的方法:
DECLARE @SQL NVARCHAR(MAX)
SET @SQL = N'SELECT x.*
FROM X x
WHERE 1 = 1 '
SET @SQL = @SQL + CASE
WHEN @a IS NULL THEN ' '
ELSE ' AND x.col1 LIKE @a '
END
SET @SQL = @SQL + CASE
WHEN @b IS NULL THEN ' '
ELSE ' AND x.col2 LIKE @b '
END
BEGIN
EXEC sp_executesql @SQL,
N'@a VARCHAR(10), @b VARCHAR(10)',
@a, @b
END
关于SQL Server 2005 - WHERE 子句 - 使用 IF 或 CASE 或 BOOLEAN?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4074310/