识别多列中具有特定值的行

时间:2019-01-30 00:34:27

标签: sql sql-server tsql

每行都有一个ID和一个类别存在/状态组合。示例代码:

DECLARE @sample_table TABLE (
    Id INT
    ,Category_Alpha BIT
    ,Category_Beta BIT
    ,Category_Charlie BIT
    ,Status_Alpha CHAR(8)
    ,Status_Beta CHAR(8)
    ,Status_Charlie CHAR(8)
    );
INSERT INTO @sample_table
VALUES
    (1,1,0,0,'Approved','Open','Open')
    ,(2,1,1,0,'Pending','Approved','Open')
    ,(3,0,0,1,'Open','Open','Rejected')
    ,(4,0,1,0,'Open','Approved','Open')
    ,(5,1,1,1,'Approved','Rejected','Approved');
SELECT * FROM @sample_table;

产生:

Id  Category_Alpha  Category_Beta   Category_Charlie    Status_Alpha    Status_Beta Status_Charlie
1        1               0               0                  Approved    Open        Open    
2        1               1               0                  Pending     Approved    Open    
3        0               0               1                  Open        Open        Rejected
4        0               1               0                  Open        Approved    Open    
5        1               1               1                  Approved    Rejected    Approved

因此,每行可以有一个“ Alpha”(是/否)和一个对应的“ Alpha”状态(“待定”,“已批准”等)。其他类别(Beta和Charlie)也是如此。 空的类别始终具有“打开”状态。例如,Id为1的行的Category_Beta = 0(否),因此相应的Status_Beta为“打开”。

在示例中,我提供了3个类别(Alpha,Beta,Charlie),但我的实际数据有40多个类别。 我想找到所有“非空缺”类别都为“已批准”的行。在提供的示例中,这将是第1行和第4行。

2 个答案:

答案 0 :(得分:2)

这只是一个复杂的where子句:

select t.*
from t
where (category_alpha = 0 or status_alpha = 'Approved') and
      (category_beta = 0 or status_beta = 'Approved') and
      (category_charlie = 0 or status_charlie = 'Approved');

答案 1 :(得分:0)

或者,如果您只想使用状态名称:

SELECT *
FROM @sample_table
where Status_Alpha in ('Open','Approved') and Status_Beta in ('Open','Approved') and Status_Charlie in ('Open','Approved')
and (Status_Alpha = 'Approved' or Status_Beta = 'Approved' or Status_Charlie = 'Approved');