Sql 具有设置列数的动态where子句
我引入了来自任意源的参数,可能传递了1、2或3个参数,它们需要作为sql查询中的where子句 如何编写此查询,以便无论传递了哪些参数,查询都将以尽可能多的参数运行。我在想:Sql 具有设置列数的动态where子句,sql,Sql,我引入了来自任意源的参数,可能传递了1、2或3个参数,它们需要作为sql查询中的where子句 如何编写此查询,以便无论传递了哪些参数,查询都将以尽可能多的参数运行。我在想: Passed in: x=1,y=null,z=5 //Do some simple checks and assign local variables when the value are not null. if(arg == null) { arg = (/*some wild card that allows
Passed in: x=1,y=null,z=5
//Do some simple checks and assign local variables when the value are not null.
if(arg == null)
{
arg = (/*some wild card that allows any value to be returned*/)
}
else{
arg = arg
}
生成的子句:其中X=localx,Y=(任意值)和Z=localz
在这个例子中,我可以用什么来表示Y,这样我就可以避免动态地创建一个参数量可变的字符串?我发现自己很难清楚地表达这个问题。我将假设SQL Server。使用ISNULL命令,并在未提供时将所有传入参数设置为null
SELECT *
FROM Table
WHERE ISNULL(@Param1,Field1)=Field1
AND ISNULL(@Param2,Field2)=Field2
AND ISNULL(@Param3,Field3)=Field3
AND ISNULL(@Param4,Field4)=Field4
AND ISNULL(@Param5,Field5)=Field5
如果任何字段可能具有空值,则更好的解决方案是:
SELECT *
FROM Table
WHERE (@Param1 is null or @Param1 = Field1) and
(@Param2 is null or @Param2 = Field2) and
(@Param3 is null or @Param3 = Field3) and
(@Param4 is null or @Param4 = Field4) and
(@Param5 is null or @Param5 = Field5)
这与使用isnull
的解决方案之间的主要区别在于,此版本处理字段中的空值。表达式isnull(@param1,field1)=field1
在@param1为NULL且field1为NULL时返回false。表达式@Param1为null或@Param1=Field1
在两者均为null时返回true