有没有办法通过information_schema
或其他方式计算一个表(或一组表,更好)的每列中有多少百分比是NULL
?
答案 0 :(得分:2)
Your query有很多问题,最重要的是你没有转义标识符(在最坏的情况下可能导致异常或SQL注入攻击)并且你没有考虑模式。 改为使用:
SELECT 'SELECT ' || string_agg(concat('round(100 - 100 * count(', col
, ') / count(*)::numeric, 2) AS ', col_pct), E'\n , ')
|| E'\nFROM ' || tbl
FROM (
SELECT quote_ident(table_schema) || '.' || quote_ident(table_name) AS tbl
, quote_ident(column_name) AS col
, quote_ident(column_name || '_pct') AS col_pct
FROM information_schema.columns
WHERE table_name = 'my_table_name'
ORDER BY ordinal_position
) sub
GROUP BY tbl;
生成如下查询:
SELECT round(100 - 100 * count(id) / count(*)::numeric, 2) AS id_pct
, round(100 - 100 * count(day) / count(*)::numeric, 2) AS day_pct
, round(100 - 100 * count("oDd X") / count(*)::numeric, 2) AS "oDd X_pct"
FROM public.my_table_name;
关于dba.SE的详细相关答案有更多细节:
答案 1 :(得分:0)
认为没有内置功能。你可以做这个自我
只需遍历表中的每一列,并计算所有行的计数count()和列为null的行的count()。
对于一个表的一个查询,可以并优化它。
答案 2 :(得分:0)
好的,我玩了一会儿并提出了一个返回查询的查询 - 如果您使用LIKE 'my_table%'
而不是= 'my_table_name'
则会进行查询:
SELECT 'select '|| string_agg('(count(*)::real-count('||column_name||')::real)/count(*)::real as '||column_name||'_percentage ', ', ') || 'from ' || table_name
FROM information_schema.columns
WHERE table_name LIKE 'my_table_name'
GROUP BY table_name
它返回一个可立即运行的SQL查询,如:
"SELECT (count(*)::real-count(id)::real)/count(*)::real AS id_percentage , (count(*)::real-count(value)::real)/count(*)::real AS value_percentage FROM my_table_name"
id_percentage;value_percentage
0;0.0177515
(对于可读性,上限并没有完全正确。)