SQL Server 2005 - WHERE 子句 - 使用 IF 或 CASE 或 BOOLEAN?

标签 sql sql-server sql-server-2005 tsql

我已经研究了这个场景几个小时,但似乎找不到任何直接解决它的东西。

我有很多可选参数传递到存储过程中。我想返回一个没有过滤的记录集,传递给存储过程的一个或多个可选参数。

我正在尝试生成单个查询来执行此操作。

这是我的伪代码(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/

相关文章:

python - 使用 UPDATE FOR 和外键锁定 postgres

sql - Postgresql 只从列中选择字母

sql-server - INNER JOINS 中的多个 ON 子句在一起意味着什么

sql - 删除数字

c# - 直接插入或通过存储过程插入

sql - 替换 sql 字符串中第一次出现的 '.'

sql-server - 选择不在另一个表中的键需要永远

php - 将值从一个表复制到另一个表

sql-server - 如何在 SQL Server 2005 中从 MDF 恢复数据库?

python - 如何删除 csv 文件中值周围的三重双引号?