【问题标题】:SQL Server: How to handle two different cases in Where clauseSQL Server:如何在 Where 子句中处理两种不同的情况
【发布时间】:2014-10-06 08:36:27
【问题描述】:

我在 SQL Server 2008 中有一个用于从表中获取数据的存储过程。

我的输入参数是:

@category nvarchar(50) = '',
@departmentID int

我的 Where 子句是:

WHERE       A.departmentID = @departmentID
AND         A.category = @category

有什么方法可以在此 Where 子句中应用 Case 语句(或类似的语句)来表示它只应在 @category 不是 '' 并且 否则选择所有类别时检查类别匹配强>?

我在这里唯一能想到的就是使用以下内容。从技术上讲,这是可行的,但是我无法检查此处所需的确切类别匹配:

WHERE       A.departmentID = @departmentID
AND         A.category LIKE '%'+@category+'%'

【问题讨论】:

    标签: sql sql-server case where where-clause


    【解决方案1】:

    你可以修改你的WHERE子句如下:

    WHERE A.departmentID = @departmentID
      AND (@category = '' or A.category = @category)
    

    【讨论】:

    • 这是完美的——正是我想要的。非常感谢 - 我会尽快接受! :)
    【解决方案2】:
    WHERE A.departmentID = @departmentID
      AND ((@category = '') or (@category <> '' AND A.category = @category))
    

    这应该给你你想要的结果集,它基本上是检查一个空白类别,然后应该返回部门 ID 的所有结果,或者只返回参数中指定的类别。

    【讨论】:

    • 也谢谢你!刚刚看到其他答案在我的情况下就足够了,因为数据库中的类别不能为空。
    【解决方案3】:

    如果您从前端传递,也请考虑 null 值

    WHERE A.departmentID = @departmentID
      AND ( ( isnull(@category,'') = '' or  A.category = @category )
    

    【讨论】:

      【解决方案4】:

      这样试试

      if(LTRIM(RTRIM(@category))='')   --if string is empty then set it to NULL
      set @category=NULL
      
      select * from tbl_name A
      WHERE       A.departmentID = @departmentID
      AND         A.category = @category
      (AND         A.category LIKE '%'+@category+'%' OR @category IS NULL)
      

      这里如果我们指定NULL,右边OR条件将返回true 因此,如果我们指定@category NULL OR ''(空),它会给出正确的结果

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-24
        • 2023-03-03
        相关资源
        最近更新 更多