考虑一个具有两个可空列的ab以及任何其他任意列的表。

我可以用以下方法计算一列不为空的情况:

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)

08-04 14:46