如何获得表中所有列的计数(*)?使用PostgreSQL

ucl*_*tro 4 sql database postgresql navicat

我有一堆桌子,其中几个有数百列。我需要为每一列获取非空值的计数,并且我一直在手动进行。我想找出一种方法来获取表中所有列的所有计数。我查找了stackoverflow和google,但是找不到答案。

我试过了,但每列只返回值1。我知道它只是在计算列数,而不是每列中的值。有什么建议么?

select count(COLUMN_NAME)
from information_schema.columns
where table_schema = 'schema_name'
and table_name = 'table_name'
group by COLUMN_NAME
Run Code Online (Sandbox Code Playgroud)

Kau*_*yak 6

COUNT(column_name)总是给您计NON NULL数值。

创建一个像这样的通用函数,可以将模式名称和表名称作为参数。

在这里,我正在构建由UNION ALLs 连接在一起的select语句,每个语句返回column_name的值,并且在动态执行时对所有列进行计数。

CREATE OR REPLACE FUNCTION public.get_count( TEXT, TEXT )
RETURNS  TABLE(t_column_name  TEXT, t_count BIGINT )
LANGUAGE plpgsql
AS $BODY$
DECLARE
p_schema        TEXT := $1;
p_tabname       TEXT := $2;
v_sql_statement TEXT;

BEGIN

SELECT STRING_AGG( 'SELECT ''' 
       || column_name 
       || ''',' 
       || ' count(' 
       || column_name 
       || ')  FROM ' 
       || table_schema 
       || '.' 
       || table_name 
         ,' UNION ALL ' ) INTO v_sql_statement
FROM   information_schema.columns 
WHERE  table_schema   = p_schema 
       AND table_name = p_tabname; 

    IF v_sql_statement IS NOT NULL THEN
     RETURN QUERY EXECUTE   v_sql_statement;
    END IF;
END
$BODY$;
Run Code Online (Sandbox Code Playgroud)

执行

knayak=# select c.col, c.count from 
 public.get_count( 'public', 'employees' ) as c(col,count);
      col       | count
----------------+-------
 employee_id    |   107
 first_name     |   107
 last_name      |   107
 email          |   107
 phone_number   |   107
 hire_date      |   107
 job_id         |   107
 salary         |   107
 commission_pct |    35
 manager_id     |   106
 department_id  |   106
(11 rows)
Run Code Online (Sandbox Code Playgroud)