在SQL Server WHERE子句中引入基于某些条件的过滤器

时间:2015-09-18 10:06:57

标签: sql sql-server sql-server-2012

我正在使用以下T-SQL

形成动态SQL
Declare @sql nvarchar(max);
Declare @var1 int = 10, @var2 int = 10, @var3 int = 10

set @sql = 'select col1, col2, col3 
            from table
            where col1 = ' + @var1

IF (@var2 > 0)
BEGIN
    SET @sql += ' AND col2 = ' + CONVERT(NVARCHAR(10), @var2)
END

IF (@var3 > 0)
BEGIN
    SET @sql += ' AND col3 = ' + CONVERT(NVARCHAR(10), @var3)
END

它运行正常,但我希望使用大小写时将其转换为静态SQL。

请提出一些转换此声明的建议。

2 个答案:

答案 0 :(得分:1)

这是查询

select col1,col2,col3 
from table
where col1=@var1 AND
(@var2<=0 OR col2=CONVERT(NVARCHAR(10), @var2)) AND
(@var3<=0 OR col3=CONVERT(NVARCHAR(10), @var3))

答案 1 :(得分:1)

Mattia的回答是正确的,如果你想使用CASE WHEN,那么这里有另一种选择(虽然我更喜欢Mattia的)

SELECT
    Col1, Col2, Col3
FROM
    Table1
WHERE
    Col1 = @Var1
AND Col2 = CASE
                WHEN @Var2 > 0 THEN CONVERT(NVARCHAR(10), @var2)
                ELSE Col2
            END
AND Col3 = CASE 
                WHEN @Var3 > 0 THEN CONVERT(NVARCHAR(10), @var3)
                ELSE Col3
            END