Redshift中是否存在SQL特性可返回表内每列的最大值?
高效识别Redshift表中全为NULL的列
针对你有大量列(1600列)的Redshift表,要快速找出全为NULL的列,以下是几个比手动重复查询或Excel拼接更高效的方案:
方案1:通过系统表生成动态SQL(推荐)
Redshift自带的information_schema.columns存储了所有表的元数据,用它自动生成检查SQL,无需手动拼接每一列。
生成检查SQL
替换your_schema和your_table为你的实际schema和表名,执行:
SELECT 'SELECT ' || STRING_AGG( 'COUNT(' || QUOTE_IDENT(column_name) || ') AS ' || QUOTE_IDENT(column_name), ', ' ) || ' FROM ' || QUOTE_IDENT(table_schema) || '.' || QUOTE_IDENT(table_name) FROM information_schema.columns WHERE table_schema = 'your_schema' AND table_name = 'your_table';
这个查询会输出一条包含所有列COUNT()统计的SQL,比如:
SELECT COUNT(column1) AS column1, COUNT(column2) AS column2, ... FROM your_schema.your_table;
执行生成的SQL
运行这条生成的SQL后,结果中值为0的列就是全为NULL的列——因为COUNT()会忽略NULL值,全NULL的列统计结果必然是0。
方案2:转置列到行批量检查
如果觉得1600列的横向结果不好查看,可以生成转置后的SQL,把每列的检查结果按行输出:
SELECT 'SELECT ''' || column_name || ''' AS column_name, COUNT(' || QUOTE_IDENT(column_name) || ') AS non_null_count FROM ' || QUOTE_IDENT(table_schema) || '.' || QUOTE_IDENT(table_name) || ' UNION ALL ' FROM information_schema.columns WHERE table_schema = 'your_schema' AND table_name = 'your_table' ORDER BY ordinal_position;
复制输出的SQL,去掉最后一行末尾的UNION ALL后执行,结果里non_null_count为0的列就是全NULL列。
方案3:直接标记全NULL列
如果想直接看到每列是否全为NULL的标记,用CASE结合MAX生成SQL:
SELECT 'SELECT ' || STRING_AGG( 'CASE WHEN MAX(' || QUOTE_IDENT(column_name) || ') IS NULL THEN ''全NULL'' ELSE ''有数据'' END AS ' || QUOTE_IDENT(column_name), ', ' ) || ' FROM ' || QUOTE_IDENT(table_schema) || '.' || QUOTE_IDENT(table_name) FROM information_schema.columns WHERE table_schema = 'your_schema' AND table_name = 'your_table';
执行后就能直观看到每列的状态。
关键提示
QUOTE_IDENT()用于处理列名/表名含特殊字符或关键字的情况,避免语法错误。- 这些方案只需要扫描表一次,比手动跑1600次查询效率提升几个量级,适合数百万行的大表。
- 多张表的话,只需替换查询中的schema和表名即可批量处理。
内容的提问来源于stack exchange,提问作者David Jerome
相关产品推荐
相关产品推荐

