T-SQL中的动态WHERE子句

时间:2014-12-19 16:59:45

标签: sql sql-server sql-server-2008 tsql

如果字段值或字段值组合匹配,我需要显示报告 我设计了一个表来存储字段或字段组合的 ReportId 值。我已将值存储在一个模式中,以便我可以为SQL构造WHERE子句以获取所需的数据。以下是表格数据:

 Field1 Field2 Field3 ReportId

 2       NULL   NULL  Rep1     
 5       4      NULL  Rep2
 6       NULL   8     Rep4

现在,我想创建一个存储过程来获取相关的 ReportId 。在存储过程中,我将以下参数作为输入:

Parameter1,Parameter2,Parameter3

在存储过程中,我想构造一个带有动态WHERE子句的SQL来获取 ReportId 。 WHERE子句将AND运算符放在所有NON NULL字段之间,并与传递的参数进行比较。 根据给定的表数据,第一行中的非空字段是“Field1”。所以WHERE子句将是

Field1 = Parameter1

根据给定的表数据,第二行中的非空字段是“Field1”和“Field2”。所以WHERE子句将是:

Field1 = Parameter1 AND Field2 =Parameter2

根据给定的表数据,第三行中的非空字段是“Field1”和“Field3”。所以WHERE子句将是:

Field1 = Parameter1 AND Field3 =Parameter3

如何为此要求编写带动态WHERE子句的通用SQL?

3 个答案:

答案 0 :(得分:1)

Le叹息。

我想到的解决方案很简单:

WHERE (Field1 IS NULL OR Field1=@Parameter1)
AND (Field2 IS NULL OR Field2=@Parameter2)
AND ...

您可以将任意数量的字段/参数配对堆叠到此解决方案中。

答案 1 :(得分:0)

您可以通过将where子句附加到NVARCHAR(MAX)变量来构造查询,然后使用内置函数sp_executesql中的sql执行该查询

例如

DECLARE @query NVARCHAR(MAX);
SET @query = 'SELECT @Count = COUNT(*) FROM Reports WHERE 1=1 '
IF @Field1 IS NOT NULL
        SET @query = @query + 'AND Field1 = @Field1 '
......
......
......

EXECUTE sp_executesql @query, 
          N'@Field1 VARCHAR(MAX),
            ....
            ....
          @Param1,
          .....
          .....

我希望这有助于你找到正确的方向。

答案 2 :(得分:0)

如果您考虑所寻找的内容并重述您的问题,那就更容易了。你真的想做什么?您希望包含每个字段与传递的参数匹配的行,或者表中的值是否为null。因此,您希望匹配每个字段为空的行,或者匹配参数:

WHERE (Field1 is null OR Field1 = @Parameter1)
    AND (Field2 is null OR Field2 = @Parameter2)
    AND (Field3 is null OR Field3 = @Parameter2)