如果字段值或字段值组合匹配,我需要显示报告 我设计了一个表来存储字段或字段组合的 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?
答案 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)