Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 具有设置列数的动态where子句_Sql - Fatal编程技术网

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

我引入了来自任意源的参数,可能传递了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 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