我的用例是计算表中每列的空值(有500列)。由于列数很多,我无法手动完成。任何人都可以建议我如何继续...
答案 0 :(得分:1)
对于任何给定的列,您当然可以运行:
select count(1) from column_name where column_name is null
但是,对于500列,您肯定希望以编程方式创建查询。您有两个选择:哪个更快将取决于您的表格大小以及列的编码方式。
选项1:逐列方法
如果您运行以下查询(使用WHERE tablename='yourtable'
而非“用户”),则输出本身就是一个可以运行以获得答案的查询。
SELECT 'select \'spacer\' AS column_name, 0 AS null_count ' union all
SELECT 'union all select \'' || "column" || '\', count(1) from ' || tablename || ' where ' || "column" || ' is null'
FROM pg_table_def
WHERE tablename = 'users'
AND NOT "notnull"
选项2:逐行方法
此查询的输出还会为您提供空计数(请务必将users
的两个实例更改为您自己的表名!)
SELECT 'select' UNION ALL SELECT 'count(nvl2(' || "column" || ',null,1)) as ' || "column" || ', '
FROM pg_table_def
WHERE tablename = 'users'
AND NOT "notnull"
UNION ALL
SELECT 'null as spacer from users '
第二个选项使用两个奇怪的功能。首先,count(exp)
将计算exp
不为空的实例数。
第二,更令人困惑:如果exp不为null,nvl2(exp, val1, val2)
方法将返回val1,如果为null,则返回val2。因此nvl2(exp,null,1)
相当于nullif(exp is not null)
。这意味着count(exp)
将计算exp的非null出现次数,而count(nvl2(exp,null,1))
将计算exp的空出现次数。