我有一个SQL Server存储过程,它根据一组条件参数过滤一组数据。
@Parameter1 int = null,
@Parameter2 int = null,
@Parameter3 int = null,
@Parameter4 int = null,
@Parameter5 int = null,
@UseOR bit = False
Select *
From Table
Where
(@Parameter1 Is Null Or Column1 = @Parameter1) And
(@Parameter2 Is Null Or Column2 = @Parameter2) And
(@Parameter3 Is Null Or Column3 = @Parameter3) And
(@Parameter4 Is Null Or Column4 = @Parameter4) And
(@Parameter5 Is Null Or Column5 = @Parameter5)
但是对于某些用户来说,需要将两个列(Column3和Column4)与OR连接而不是AND。
这是@UseOR
参数的来源。因此,仅对于某些用户(将在应用程序代码中定义),查询应在第3列和第4列之间具有OR,例如:
Select *
From Table
Where
(@Parameter1 Is Null Or Column1 = @Parameter1) And
(@Parameter2 Is Null Or Column2 = @Parameter2) And
(@Parameter3 Is Null Or Column3 = @Parameter3) OR
(@Parameter4 Is Null Or Column4 = @Parameter4) And
(@Parameter5 Is Null Or Column5 = @Parameter5)
对于其他人来说,它就像原版一样。我不确定是否可以根据AND
是否为真来将OR
更改为@UseOR
。在我看来,拥有这样的东西会很好:
Select *
From Table
Where
(@Parameter1 Is Null Or Column1 = @Parameter1) And
(@Parameter2 Is Null Or Column2 = @Parameter2) And
(@Parameter3 Is Null Or Column3 = @Parameter3) IIF(@UseOR = True, OR, AND)
(@Parameter4 Is Null Or Column4 = @Parameter4) And
(@Parameter5 Is Null Or Column5 = @Parameter5)
但显然这不起作用。有没有办法做这样的事情,或者我是以完全错误的方式思考它?
答案 0 :(得分:2)
一个麻烦的解决方案是这样的:
@Parameter1 int = null,
@Parameter2 int = null,
@Parameter3 int = null,
@Parameter4 int = null,
@Parameter5 int = null,
@UseOR bit = False
Select * From Table
Where
(@Parameter1 Is Null Or Column1 = @Parameter1) And
(@Parameter2 Is Null Or Column2 = @Parameter2) And
(
(
@UseOR = 0 AND
((@Parameter3 Is Null Or Column3 = @Parameter3) And (@Parameter4 Is Null Or Column4 = @Parameter4))
) OR
(
@UseOR = 1 AND
((@Parameter3 Is Null Or Column3 = @Parameter3) OR (@Parameter4 Is Null Or Column4 = @Parameter4))
)
) And
(@Parameter5 Is Null Or Column5 = @Parameter5)