在CASE子句中传递多个值

时间:2018-08-30 10:41:22

标签: sql tsql

我有3种状态,如下:

  1. 有效,正在进行中
  2. 已批准,已发货
  3. 已关闭,已拒绝

我想做的是构造一个SQL查询并在CASE中添加一个WHERE子句。到目前为止,我有以下内容:

DECLARE @showFirstSetOfStatuses BIT = 1
DECLARE @showSecondSetOfStatuses BIT = 0
DECLARE @showThirdSetOfStatuses BIT = 0

SELECT RequestId, RequestName, RequestStatus
FROM SomeTable md
WHERE md.RequestStatus IN(CASE WHEN @showFirstSetOfStatuses = 1 THEN 'Active, In Process' 
                      WHEN @showSecondSetOfStatuses = 1 THEN 'Approved, Shipped' 
                      WHEN @showThirdSetOfStatuses = 1 THEN 'Closed, Rejected' END)

这当然不会带来任何结果,因为它与状态不匹配。我似乎无法弄清楚如何在THEN子句的CASE部分中传递多个值。所以像

THEN 'Active', 'In Progress'
...

有人可以告诉我该怎么做还是不可能?

1 个答案:

答案 0 :(得分:2)

这是您想要的吗?

SELECT RequestId, RequestName, RequestStatus
FROM SomeTable md
WHERE ( (@showFirstSetOfStatuses = 1 AND md.RequestStatus IN ('Active', 'In Process') ) OR
      ( (@showSecondSetOfStatuses = 1 AND md.RequestStatus IN ('Approved', 'Shipped') ) OR 
        (@showThirdSetOfStatuses = 1 AND md.RequestStatus IN ('Closed', 'Rejected') )
      );

值得深思的:我将使用一个带有三个值的标志,而不是三个不同的标志:

DECLARE @showSetOfStatuses INT = 1;

SELECT RequestId, RequestName, RequestStatus
FROM SomeTable md
WHERE ( (@showSetOfStatuses = 1 AND md.RequestStatus IN ('Active', 'In Process') ) OR
      ( (@showSetOfStatuses = 2 AND md.RequestStatus IN ('Approved', 'Shipped') ) OR 
        (@showSetOfStatuses = 3 AND md.RequestStatus IN ('Closed', 'Rejected') )
      );