我有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.
我不想写出所有可能的组合。有没有更简单的方法?谢谢。
答案 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值。
如果您的列中可能包含CONCAT
或Y
/ 空字符串以外的其他值,我们仍然可以采用这种方法,但这当然需要进行一些修改。
您可以使用它来获取所有行的集合并应用任何类型的过滤器,也可以使用NULL
将其转换为WHERE