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

如何用json_build_object构建不含空值键的动态JSON对象?

解决PostgreSQL json_build_object仅保留非空键值对的问题

方法一:结合CASE语句与json_strip_nulls

通过CASE判断每个键值对是否符合有效条件(非空键+非0值),不符合则返回NULL,再用json_strip_nulls移除所有含NULL的键值对:

SELECT json_strip_nulls(
    json_build_object(
        CASE WHEN value1 <> '' AND qty1 <> 0 THEN value1 END, 
        CASE WHEN value1 <> '' AND qty1 <> 0 THEN qty1 END,
        CASE WHEN value2 <> '' AND qty2 <> 0 THEN value2 END, 
        CASE WHEN value2 <> '' AND qty2 <> 0 THEN qty2 END,
        CASE WHEN value3 <> '' AND qty3 <> 0 THEN value3 END, 
        CASE WHEN value3 <> '' AND qty3 <> 0 THEN qty3 END
    )
) FROM json_object;

方法二:用UNION ALL拆分键值对再聚合(更适合多列场景)

先将每组(valueN, qtyN)拆分为独立行,过滤无效记录后,用json_object_agg按ID聚合生成目标JSON:

SELECT id, json_object_agg(key, value)
FROM (
    SELECT id, value1 AS key, qty1 AS value FROM json_object WHERE value1 <> '' AND qty1 <> 0
    UNION ALL
    SELECT id, value2 AS key, qty2 AS value FROM json_object WHERE value2 <> '' AND qty2 <> 0
    UNION ALL
    SELECT id, value3 AS key, qty3 AS value FROM json_object WHERE value3 <> '' AND qty3 <> 0
) AS kv_rows
GROUP BY id;

说明

  • 上述条件中,valueN <> ''过滤空字符串键,qtyN <> 0过滤值为0的情况,可根据实际需求调整判断规则(比如允许qty为0但禁止键为空)。
  • 两种方法都能得到你期望的输出结果:
    {"A": 10}
    {"A": 10, "B": 5, "C": 10}
    {"A": 10, "B": 5}
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 03:45:10