>我有 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 值。
如果您的列可能包含除Y
或NULL
/空字符串以外的其他值,我们仍然可以走这条路,但这当然需要一些调整......
提示
您可以使用它来获取所有行的集合并应用任何类型的过滤器,也可以将其转换为带有LEN(...)>1
的WHERE