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

如何用PostgreSQL jsonb方法转换含任意键的JSON对象?

PostgreSQL JSONB 对象结构转换方案

要实现将任意键、整数值的JSONB对象,转换为每个键对应{"f": 原数值}的结构,可以通过拆分-转换-聚合的流程完成,具体如下:

基础转换示例

针对单个JSONB值,使用以下SQL语句:

SELECT jsonb_object_agg(key, jsonb_build_object('f', value::int))
FROM jsonb_each('{"a":1, "sql":5}'::jsonb);

执行后将输出:{"a": {"f": 1}, "sql": {"f": 5}}

核心函数说明

  • jsonb_each(input_jsonb):将输入的JSONB对象拆分为多行记录,每行包含key(原对象的键名)和value(原对象的对应值)
  • jsonb_build_object('f', value::int):将原整数值包装为{"f": 数值}的JSONB结构
  • jsonb_object_agg(key, new_value):将处理后的键值对重新聚合为一个完整的JSONB对象

处理表中字段

如果要处理表中的JSONB字段(例如表test包含id和data字段),可以用关联查询结合聚合:

SELECT 
    id,
    jsonb_object_agg(key, jsonb_build_object('f', value::int)) AS transformed_data
FROM test, jsonb_each(data)
GROUP BY id;

兼容非整数值的场景

如果原JSONB对象中存在非整数值,可通过CASE语句保留原结构,避免报错:

SELECT jsonb_object_agg(
    key,
    CASE WHEN jsonb_typeof(value) = 'number' THEN jsonb_build_object('f', value::numeric) ELSE value END
)
FROM jsonb_each('{"a":1, "sql":5, "b":"hello"}'::jsonb);

内容的提问来源于stack exchange,提问作者bart van deenen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 00:10:31