编码14!空列的组合

时间:2018-10-23 21:23:27

标签: tsql null combinations multiple-columns

我有14个可能的列,每个列可以是'Y'值或NULL /空字符串以及超过37K的数据行(因此手动无法工作)。

我需要知道所有选中两个或更多'Y'的行。基本上每一行应该只有一列标记为“是”,并且如果我有多于一列的列,则需要查找错误。

I need to test all the possible combinations where 
columnA and columnB are not null, 
and columnA and columnC are not null, then 
columnB and columnC etc.

我不想写出所有可能的组合。有没有更简单的方法?谢谢。

2 个答案:

答案 0 :(得分:3)

您可以像这样使用条件求和:

select * from your_table
where 
(
    iif(columnA ='y',1,0) 
  + iif(columnB ='y',1,0) 
  + iif(columnC ='y',1,0)
  -- etcetra for the remaining columns...
  > 1
)

上面的where子句将返回具有多列且值为 y 的所有行。

答案 1 :(得分:2)

另一个建议:

python manage.py migrate

结果

DECLARE @tbl TABLE(ID INT IDENTITY,ColA VARCHAR(10),ColB VARCHAR(10),ColC VARCHAR(10),ColD VARCHAR(10),ColE VARCHAR(10));
INSERT INTO @tbl VALUES(NULL,NULL,NULL,'Y',NULL)
                      ,(NULL,'Y',NULL,'Y',NULL)
                      ,('Y','Y','','Y','')
                      ,(NULL,NULL,NULL,NULL,NULL)
                      ,(NULL,'',NULL,'Y',NULL)
                      ,('Y','',NULL,'Y',NULL)
                      ,('','',NULL,'Y',NULL);
SELECT * 
     ,LEN(CONCAT(ColA,ColB,ColC,ColD,ColE)) CountOfY
FROM @tbl 

这将use CONCAT() (v2012+)建立所有列的串联字符串。然后我们检查字符串的长度。 1 NULL NULL NULL Y NULL Y 1 2 NULL Y NULL Y NULL YY 2 3 Y Y Y YYY 3 4 NULL NULL NULL NULL NULL 0 5 NULL NULL Y NULL Y 1 6 Y NULL Y NULL YY 2 7 NULL Y NULL Y 1 的优势在于隐式处理类型转换和NULL值。

如果您的列中可能包含CONCATY / 空字符串以外的其他值,我们仍然可以采用这种方法,但这当然需要进行一些修改。

提示

您可以使用它来获取所有行的集合并应用任何类型的过滤器,也可以使用NULL将其转换为WHERE