首页 > 解决方案 > 如何计算每列中有多少个空值?

问题描述

我有一个像这样的表A:

col1col2col3
1 0null
nullnullnull
3nullnull
null 5 1

我想在Oracle 10G中得到这样的输出:

column_namenull_count
col1 2
col2 2
col3 3

我使用UNION ALL实现了这一点,如下所示:

select "col1" column_name,sum(case when col1 is null then 1 else 0 end) as null_count from A group by "col1"
union all
select "col2" column_name,sum(case when col2 is null then 1 else 0 end) as null_count from A group by "col2"
union all
select "col3" column_name,sum(case when col3 is null then 1 else 0 end) as null_count from A group by "col3";

它运行良好,但需要花费大量时间,因为有近 100 个UNION ALL。我想在不使用UNION ALL的情况下实现相同的输出。

有没有办法在不使用UNION ALL的情况下实现这一目标?

标签: sqloracleoracle10g

解决方案


您可以为此使用 UNPIVOT(我不确定古代 Oracle 10 是否已经支持该功能 - 我已经十多年没有使用它了)

select colname, count(*) - count(val) as num_nulls
from t1
  UNPIVOT include nulls 
      (val for colname in (col1 as 'C1', 
                           col2 as 'C2', 
                           col3 as 'C3'))
group by colname
order by colname; 

不确定这是否更快。

在线示例:https ://dbfiddle.uk/?rdbms=oracle_11.2&fiddle=4e807b8b2d8080abac36574f776dbf04


推荐阅读