考虑一个具有两个可空列的a
和b
以及任何其他任意列的表。
我可以用以下方法计算一列不为空的情况:
select count(a) from ...
我可以用以下方法计算任一列都不为null的情况:
select count(coalesce(a, b)) from ...
但是,我能够弄清楚如何计算两列都不为null的情况的唯一方法就是笨拙:
select sum(iif(a is not null and b is not null, 1, 0)) from ...
如果两者都不为空,是否有更简洁的方法来计数?如果没有通用方法,那么是否两列都是
int
还是两列都是nvarchar
呢?我不想在
where
子句中这样做的原因,例如:select count(*) from ... where a is not null and b is not null
是我一次从同一个子查询中选择多个计数:
select count(*)
,count(a)
,count(b)
,sum(iif(a is not null and b is not null, 1, 0))
from ...
需要采取这种形式的另一个原因在这里无法解释,但基本上归结为这是rather complicated query的一部分,它具有与性能相关的非常特定的结构。
这个问题更多是出于好奇,因为
sum(iif(...))
确实起作用,我只是想知道对于and情况,是否有像coalesce(a, b)
这样简洁的内容。这是SQL Server 2016 SP1。
最佳答案
在特殊情况下,如果两列都是nvarchar,
你可以尝试
COUNT(a + b)
如果数据类型为整数,则使用
Count(a/2 + b/2)
为了避免溢出错误。
注意:仅当a和b都不为null时,a + b才为null
作为@JasonC的建议,我为bitwise operators类型添加了另一个解决方案:
Count(a & b)