在where子句中使用CASE表达式

时间:2019-10-24 14:59:12

标签: sql sql-server tsql case

我有一个存储的proc,带有2个参数,均为整数

我需要在where子句中使用case语句,但是我无法正确理解

where 
dbo.StockTransfer.BranchId = @branchId 
AND
CASE WHEN IsNumeric(@roleId) = 1 
THEN 
dbo.StockTransfer.StatusId !=12    
ELSE
dbo.StockTransfer.StatusId NOT in (12, 13)  
  END

order by dbo.StockTransfer.StatusId ASC

我在'dbo.StockTransfer.StatusId!= 12'中遇到错误

  

消息102,级别15,状态1,过程GetDeliveryList,第44行[批处理开始第0行]
  '!'附近的语法不正确。

2 个答案:

答案 0 :(得分:2)

不要打扰。只需使用常规逻辑即可:

where dbo.StockTransfer.BranchId = @branchId and
      ( (IsNumeric(@roleId) = 1 and 
         dbo.StockTransfer.StatusId <> 12
        ) or
        (IsNumeric(@roleId) = 0 and
         dbo.StockTransfer.StatusId not in (12, 13)
        )
     ) 

这不处理NULL值,但是可以轻松添加。

实际上,我可以简化为:

where dbo.StockTransfer.BranchId = @branchId and
      dbo.StockTransfer.StatusId <> 12 and
      (IsNumeric(@roleId) = 1 or
       dbo.StockTransfer.StatusId <> 13
      )

答案 1 :(得分:0)

给出有关您想要退还的物品的最新评论,我想应该是这样的。为了清楚起见,我添加了很多空白。

where dbo.StockTransfer.BranchId = @branchId 
    AND 
    (
        ( 
            @roleId = 1
            AND
            StatusId in (13, 14)
        )
        OR
        (
            @roleId <> 1
            AND
            StatusId = 14
        )
    )