如何获取500列表中每列的空值?

时间:2017-04-05 12:52:46

标签: sql amazon-redshift

我的用例是计算表中每列的空值(有500列)。由于列数很多,我无法手动完成。任何人都可以建议我如何继续...

1 个答案:

答案 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的空出现次数。