具有设置列数的动态where子句

时间:2013-01-04 18:59:21

标签: sql

我从任意来源引入参数,并且可能有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的字符串?我发现自己很难解决这个问题。

2 个答案:

答案 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。