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

PostgreSQL表JSON字段非空键计数:咨询最优实现方案

统计PostgreSQL JSON字段中的非空键数量:最佳实现方案

针对你的需求,我来分享几种更高效、可扩展的实现方法,分不同场景来看:

场景1:通用统计所有非空嵌套子键

如果你的需求是自动遍历JSON中所有非空的嵌套子键(比如示例里的order_frequency、units_per_order、supply_chain_need这类有实际内容的子键,排除空对象的键),可以用PostgreSQL的JSON遍历函数来实现,不用硬编码每个键:

SELECT COUNT(*) AS total_count
FROM business_requirements br,
     json_each(br.requirements) AS top_level_keys,
     json_each(top_level_keys.value) AS nested_keys
WHERE br.user_id = 3561
  AND nested_keys.value <> '{}'::json; -- 过滤值为空对象的子键

说明:

  • json_each(br.requirements)会把顶级JSON对象拆分成键值对(比如FRIDGE_SHELF_SPACE和它对应的嵌套对象)
  • 第二层json_each(top_level_keys.value)会把每个顶级对象的子键进一步拆分
  • 最后通过nested_keys.value <> '{}'::json过滤掉空对象的子键,统计剩余的非空键总数

如果你的字段是jsonb类型(推荐使用,性能更优),只需把json_each替换为jsonb_each即可。

场景2:统计特定的几个嵌套键(优化你当前的写法)

如果和你当前的需求一致,只需要统计固定的几个嵌套键是否非空,可以简化你原有的查询,让代码更简洁:

SELECT SUM(
  (requirements->'FRIDGE_SHELF_SPACE'->'order_frequency' IS NOT NULL)::INT +
  (requirements->'SUPPLY_CHAIN'->'supply_chain_need' IS NOT NULL)::INT
  -- 后续需要新增统计的键,直接在这里追加类似表达式即可
) AS total_count
FROM business_requirements
WHERE user_id = 3561;

说明:

PostgreSQL中布尔值可以直接转为整数:TRUE对应1,FALSE对应0。所以我们可以把每个键的非空判断直接转成整数相加,再用SUM统计总数,比原有的子查询+COALESCE写法更简洁。

如果担心返回NULL(比如没有匹配的行),可以用COALESCE包裹结果:

SELECT COALESCE(
  (requirements->'FRIDGE_SHELF_SPACE'->'order_frequency' IS NOT NULL)::INT +
  (requirements->'SUPPLY_CHAIN'->'supply_chain_need' IS NOT NULL)::INT,
  0
) AS total_count
FROM business_requirements
WHERE user_id = 3561;

场景3:统计非空的顶级键

如果你的需求是统计顶级键中值非空的数量(比如示例里的FRIDGE_SHELF_SPACE、SUPPLY_CHAIN,排除空对象的Rational_TAP_LINES等),可以用下面的查询:

SELECT COUNT(*) AS total_top_non_empty_keys
FROM business_requirements br,
     json_each(br.requirements) AS top_level_keys
WHERE br.user_id = 3561
  AND top_level_keys.value <> '{}'::json;

对比你当前的写法

你现有的查询是可行的,但缺点是扩展性差——后续新增需要统计的键时,必须手动添加新的CASE语句。如果是固定少量键,用场景2的优化写法更简洁;如果需要动态统计所有非空键,场景1的通用方案更合适。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 22:37:48