编码 14! 列空性的组合



>我有 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.

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

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

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的列的所有行。

另一个建议:

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 

结果

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

这将使用CONCAT()(v2012+( 构建所有列的串联字符串。然后我们检查字符串的长度。CONCAT的优势在于隐式处理类型强制转换和 NULL 值。

如果您的列可能包含除YNULL/空字符串以外的其他值,我们仍然可以走这条路,但这当然需要一些调整......

提示

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

相关内容

  • 没有找到相关文章

最新更新