计算两列非空的简明方法(在select子句中)

时间:2017-05-17 16:35:09

标签: sql sql-server tsql

考虑一个包含两个可为任意类型的ab列以及其他一些任意列的表。

我可以计算一列不为空的情况:

select count(a) from ...

我可以通过以下方式计算 列不为空的情况:

select count(coalesce(a, b)) from ...

但是,我能够弄清楚如何计算两个列不为空的情况的唯一方法是相当笨重的:

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(...)) 确实工作,我只是想知道coalesce(a, b) >和案例。

这是SQL Server 2016,SP1。

2 个答案:

答案 0 :(得分:4)

在特殊情况下,如果两列都是nvarchar, 你可以尝试

COUNT(a + b)

如果数据类型是整数,则使用

Count(a/2 + b/2)

避免溢出错误。

注意:只有当a和b都不为空时,a + b才为空

正如@JasonC的建议,我为bitwise operators类型添加了另一个解决方案:

Count(a & b)

答案 1 :(得分:1)

CASE声明应该在这里运作良好:

SELECT CASE
          WHEN a IS NULL OR b IS NULL
            THEN 0
            ELSE 1
       END
FROM ...