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

PostgreSQL中多列非空值计数(规避CASE WHEN局限性)

解决PostgreSQL多列非空值计数的高效方案

方案1:数组函数快速实现(支持动态生成列名)

利用array_remove和cardinality函数,将所有输入列打包为数组,移除NULL后获取数组长度,即为非空值数量:

SELECT 
    id,
    cardinality(array_remove(array[input1, input2, input3, ..., input39], NULL)) AS total_inputs
FROM your_table;

如果不想手动编写39个列名,可通过information_schema动态生成完整SQL:

SELECT format(
    'SELECT id, cardinality(array_remove(array[%s], NULL)) AS total_inputs FROM your_table;',
    string_agg(quote_ident(column_name), ', ')
)
FROM information_schema.columns
WHERE table_name = 'your_table' 
  AND column_name LIKE 'input%';

执行上述查询后,复制生成的SQL语句直接运行即可。

方案2:自定义可变参数函数(可复用)

创建一个支持任意数量参数的函数,统计参数中的非空值个数,后续可直接调用:

CREATE OR REPLACE FUNCTION count_non_nulls(VARIADIC args anyarray)
RETURNS integer AS $$
BEGIN
    RETURN cardinality(array_remove(args, NULL));
END;
$$ LANGUAGE plpgsql IMMUTABLE;

调用示例:

SELECT 
    id,
    count_non_nulls(input1, input2, ..., input39) AS total_inputs
FROM your_table;

该函数适配任意数量的列,无需修改函数代码即可复用。

方案3:JSONB转换自动匹配列

将整行数据转为JSONB,筛选出符合命名规则的非空字段并计数,无需手动列字段名:

SELECT 
    id,
    (SELECT count(*) 
     FROM jsonb_each_text(to_jsonb(t)) 
     WHERE key LIKE 'input%' AND value IS NOT NULL) AS total_inputs
FROM your_table t;

内容的提问来源于stack exchange,提问作者Alex

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 14:45:43