我有以下形式的数据

select t.name_field, t.value_field 
from 
(
    values 
        ('name_1', 'val_fld_1'), 
        ('name_2', null), 
        ('name_3', 'val_fld__3')
) as t(name_field,value_field);

从该数据中,我需要获得以下形式的json字符串:

{"name_1" : [{"value" : "val_fld_1", "seq" : 1}], "name_2" : [{"value" : "", "seq" : 1}], "name_3" : [{"value" : "val_fld__3", "seq" : 1}]}

我试着这样做:

select array_agg(json_build_object(t.name_field, json_build_array(json_build_object('value',  t.value_field)))) as my_test
from 
(
    values 
        ('name_1', 'val_fld_1'), 
        ('name_2', null), 
        ('name_3', 'val_fld__3')
) as t(name_field,value_field);

但这并没有给我带来想要的结果. 如何实现所需的json格式?

推荐答案

我想它应该能行得通:

SELECT json_object_agg(t.name_field, json_build_array(json_build_object('value', t.value_field, 'seq', 1))) AS my_test
FROM 
(
    VALUES 
        ('name_1', 'val_fld_1'), 
        ('name_2', null), 
        ('name_3', 'val_fld__3')
) AS t(name_field, value_field);

more about json functions:
https://www.postgresql.org/docs/current/functions-json.html#FUNCTIONS-JSON-CREATION-TABLE

Json相关问答推荐

Jolt Transformation—如果子对象为空,则将父对象更新为空

将json数组反序列化为选项 struct

JOLT将对象名作为新属性添加到主体中

Vega-Lite时钟(使用Vega-Lite中的计时器)

kotlinx-serialization:如何将具有不同类型对象的JsonArray转换为同一个Class

在Reaction中从JSON文件中筛选数组

递归解码嵌套列表(具有任意深度的列表列表)

使用 jq 获取所有嵌套键和值

APIM 生成 JsonArray 到 EventHub

取消嵌套数组并将数组名称添加为附加字段

使用 map_values Select 包含空格的字符串未按预期工作

如何将复杂的 JSON 反序列化为 Rust 类型?

Servicestack 返回数组而不是带有数组的对象

从 json 对象中过滤掉所有出现的给定属性

从 Postgres 中的 json 对象中提取键、值

数据包含连续问号时无法理解的 jQuery $.ajax() 行为

TypeError: b'1' 不是 JSON 可序列化的

使用 jq 如何用其他名称替换键的名称

如何在 Rails 模型中验证字符串是否为 json

设置对象不是 JSON 可序列化的