SQL Server:在where子句

时间:2016-06-29 11:12:26

标签: sql-server

我有一个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)

但显然这不起作用。有没有办法做这样的事情,或者我是以完全错误的方式思考它?

1 个答案:

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