sql - TSQL 可选 Where 子句

标签 sql sql-server tsql stored-procedures

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

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

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

对我来说棘手的部分是部门和类别。如果过滤器中有值,它需要仅根据这些值查找提交 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

enter image description here

最佳答案

通过查看 “如果过滤器中有一个值,它需要仅根据这些值 category=3 department=5 查找提交。但是,当过滤器设置中那些为空时,它需要忽略类别和部门,不管值是多少,都给我记录。”

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

Where (@Filter is null OR (@Filter is not null and category=3 and department=5))

更新

没有注意到你有两个参数

Where (@category is null or (category = @category))
      and (@department is null or (department= @department))

关于sql - TSQL 可选 Where 子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24658172/

相关文章:

tsql - 如何在 Visual Studio 2017 中更改 Transact-SQL 代码的自动格式?

mysql - 如何创建此查询?

sql: 按不同部分计算 um_no 的数量,按小时累计

android - 将 SQL Server 查询更改为 SQLite 中的等效查询

asp.net - 对于一个存储过程调用,SQL 登录从 Web 应用程序失败

sql - 如何更新数据库中所有表的特定列值

sql - 如果表有一行或多行存在一个条件,则获取 ID

sql - TSQL 从 xml 值中删除制表符和换行符

c# - 在类中重现 "SQL Tables"

python - Azure 数据库摄取速度