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

