我从任意来源引入参数,并且可能有1,2或3个args需要作为sql查询中的where子句。
如何编写此查询,因此无论传递什么args,查询都将尽可能多地运行args。我在想:
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
}
Generated子句:WHERE X = localx AND Y =(ANY VALUE)AND Z = localz
在这个例子中我可以使用什么Y,所以我可以避免动态创建一个带有可变数量的args的字符串?我发现自己很难解决这个问题。
答案 0 :(得分:4)
我将假设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
答案 1 :(得分:3)
更好的解决方案,如果任何字段可能具有NULL值:
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
的解决方案之间的主要区别在于此版本在字段中处理NULL值。当@ param1为NULL且field1为NULL时,表达式isnull(@param1, field1) = field1
返回false。当两者都为NULL时,表达式@Param1 is null or @Param1 = Field1
返回true。