TSQL 可选Where 子句

SBB*_*SBB 2 sql t-sql sql-server stored-procedures

我有一个查询,默认情况下会提取当月的数据。然后,我的页面上有一个“过滤器”选项,他们可以在其中输入一些数据来过滤内容并重新运行查询。

我的 select 语句适用于当前月份,但是我不太确定如何实现不包含内容的字段的逻辑。

示例:如果用户在过滤器选项中填写开始日期和结束日期,则需要使用这些日期与当前月份/年份的默认日期。

对我来说最棘手的部分是部门和类别。如果过滤器中有一个值,它需要仅根据这些值查找提交category=3 department=5。但是,当过滤器设置中的内容为空时,它需要忽略类别和部门并获取记录,无论值是什么。

这是我目前的SP:

 IF (@action = 'filter')
            BEGIN
                SELECT A.[submissionID],
                       A.[subEmpID],
                       A.[nomineeEmpID],
                       CONVERT (VARCHAR (10), A.[submissionDate], 101) AS submissionDate,
                       A.[situation],
                       A.[task],
                       A.[action],
                       A.[result],
                       A.[timestamp],
                       A.[statusID],
                       A.[approver],
                       A.[approvalDate],
                       B.[FirstName] + ' ' + B.[LastName] AS nomineeName,
                       B.[ntid] AS nomineeNTID,
                       B.[qid] AS nomineeQID,
                       C.[FirstName] + ' ' + C.[LastName] AS submitName,
                       C.[ntid] AS submitNTID,
                       D.[categoryName]
                FROM   empowermentSubmissions AS A
                       INNER JOIN
                       empTable AS B
                       ON A.[nomineeEmpID] = B.[empID]
                       INNER JOIN
                       empTable AS C
                       ON A.[subEmpID] = C.[empID]
                       INNER JOIN
                       empowermentCategories AS D
                       ON A.[categoryID] = D.[catID]
                WHERE  DATEPART(m, A.[submissionDate]) = MONTH(getdate())
                       AND DATEPART(yyyy, A.[submissionDate]) = YEAR(getdate())
                FOR    XML PATH ('data'), TYPE, ELEMENTS, ROOT ('root');
            END
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

huM*_*pty 6

通过查看“如果过滤器中有一个值,它需要仅在这些值类别 = 3 部门 = 5 上查找提交。但是,当过滤器设置中这些值为空时,它需要忽略类别和部门把唱片给我,不管价值多少。”

假设您的参数中有过滤器值,@Filter您可以执行如下操作

Where (@Filter is null OR (@Filter is not null and category=3 and department=5))
Run Code Online (Sandbox Code Playgroud)

更新

没注意到你有两个参数

Where (@category is null or (category = @category))
      and (@department is null or (department= @department))
Run Code Online (Sandbox Code Playgroud)