【问题标题】:How to use condition in T-SQL如何在 T-SQL 中使用条件
【发布时间】:2019-10-16 06:28:22
【问题描述】:

我正在尝试使用选择案例,以便在 sql 查询中使用或不使用 where 条件。但它不起作用,如果可能的话,我可以使用一些帮助来解决这个问题

DECLARE @CategoryID Int
SET @CategoryID = 0
SELECT * FROM SomeTable 
CASE WHEN @CategoryID = 0 THEN 
ELSE
WHERE        (dbo.SomeTable.ID = @CategoryID)
END

所以如果我将 0 传递给 @CategoryID 参数,我根本不应该过滤,否则我想过滤。这个可以吗?

【问题讨论】:

标签: sql-server conditional-statements case select-case


【解决方案1】:

改写您的逻辑以删除 CASE 表达式:

SELECT *
FROM SomeTable
WHERE @CategoryID IN (0, ID);

这是可行的,因为当@CategoryID = 0 时,WHERE 子句始终为真,否则当ID = @CategoryID 时为真。

您当前的尝试是一个常见问题,源于未按预期使用CASE 表达式。 CASE 表达式的 谓词(即遵循 THENELSE 之后的逻辑)必须是 literal 值,而不是另一个逻辑表达式。在这种情况下,我们甚至不需要CASE

【讨论】:

    【解决方案2】:

    您的语法错误...您必须重新排列您的 where 子句:

    DECLARE @CategoryID Int = 0;
    
    SELECT * FROM SomeTable 
    WHERE @CategoryID = 0 OR @CategoryID = ID
    

    如果变量设置为0,则where子句始终为真,否则,其值取决于条件@CategoryID = ID

    【讨论】:

      【解决方案3】:

      这是可能的,首先是根据您的case 条件构建您的查询

      DECLARE @CategoryID INT
      SET @CategoryID = 0
      declare @strsql varchar(max)
      
      set @strsql =  
          CASE WHEN coalesce(@CategoryID, 0) = 0 THEN 'SELECT * FROM SomeTable'
          ELSE
              'SELECT * FROM SomeTable WHERE 1 = '+ cast(@CategoryID as varchar(10)) + ''
          END
      print  @strsql
      exec sp_executesql @strsql
      

      【讨论】:

        猜你喜欢
        • 2020-05-06
        • 1970-01-01
        • 2017-12-19
        • 2010-12-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多