You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 15:55:59