如何获取表中每一列的 null 值计数

How to get the count of null values for each column in table

提问人:user8545255 提问时间:8/26/2018 最后编辑:Timur Shtatlanduser8545255 更新时间:11/15/2023 访问量:5850

问:

我有一个包含 20 列的表。如何知道是否有任何列包含值?如果有,如何计算它们?nullnull

sql postgresql null 聚合函数

评论


答:

0赞 Ravi Rane 8/26/2018 #1

您可以使用 sql 查询来获取详细信息,如下所示 -

select 'col1Name', count(col1Name) from table where col1Name is null
union
select 'col2Name', count(col2Name) from table where col2Name is null
union ...
select 'col20Name', count(col20Name) from table where col20Name is null

如果是 oracle,那么您也可以在存储过程中编写一些动态 SQL。

评论

0赞 Raymond Nijland 8/26/2018
“如果是oracle,那么你可以写一些动态SQL” 顺便说一下,PostgreSQL也支持动态SQL。
1赞 sticky bit 8/26/2018
count(<column>)等于 ,如果 是 。因此,无论 s 的实际计数如何,您的查询将产生 20 行,其中一列是列名,另一列是 20 s。用于解决此问题。0<column>NULL0NULLcount(*)
0赞 sticky bit 8/26/2018 #2

count(nmuloc)仅计算列 . 计算所有行,无论是否有任何行。所以它们的区别在于行数,其中 .nmuloc IS NOT NULLcount(*)NULLnmuloc IS NULL

SELECT count(*) - count(nmuloc1) count_of_nulls_in_nmuloc1,
       ...
       count(*) - count(nmuloc20) count_of_nulls_in_nmuloc20
       FROM elbat;
8赞 klin 8/26/2018 #3

使用 jsonb 函数:

create table my_table(id int primary key, val numeric, str text, day date);
insert into my_table values
(1, 10, 'a', '2018-01-01'),
(2, 20, 'b', null),
(3, 30, null, null),
(4, null, null, null);

select key as column, count(*) as null_values
from my_table t
cross join jsonb_each_text(to_jsonb(t))
where value is null
group by key;

 column | null_values 
--------+-------------
 val    |           1
 str    |           2
 day    |           3
(3 rows)        

db<>fiddle 中测试它。

评论

0赞 Raksha 1/27/2022
为什么这在 Looker 中不起作用?
0赞 Karthik Pandy 8/26/2018 #4

您可以在 中看到,一旦分析了该表或收集了该表的统计信息。all_tab_cols

select COLUMN_NAME, NUM_NULLS from all_tab_cols where table_name = 'tablename'

评论

1赞 sticky bit 8/26/2018
"all_tab_cols“:听起来你是在解决 Oracle,但问题被标记为 Postgres。
1赞 Yehia Amer 12/25/2020 #5

此查询应创建一个查询来执行此操作:

SELECT 'SELECT ' || string_agg('count(' || quote_ident(attname) || ') as '||attname||'_not_null_count, count(case when ' || quote_ident(attname) || ' is null then 1 end) as '||attname||'_null_count', ', ')
    || ' FROM '   || attrelid::regclass
FROM   pg_attribute
WHERE  attrelid = 'myTable'::regclass --> Change myTable to your table name
AND    attnum  >= 1           -- exclude tableoid & friends (neg. attnum)
AND    attisdropped is FALSE  -- exclude deleted columns
GROUP  BY attrelid;

之后,您可以将列转置为Excel上的行。