如何用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
相关产品推荐
相关产品推荐

