PostgreSQL 11:使用 json_object_agg() 的多个键值对

las*_*ain 4 sql arrays postgresql json group-by

使用 PostgreSQL 11,聚合函数json_object_agg()从键和值创建一个 JSON 对象,就像当前的正常运行时间:

# SELECT json_object_agg('uptime', date_trunc('second',
  current_timestamp - pg_postmaster_start_time()));
Run Code Online (Sandbox Code Playgroud)

这将输出 JSON 对象:

{ "uptime" : "00:45:55" }
Run Code Online (Sandbox Code Playgroud)

如何将多个键值对合并为一个对象?例如,如何将 PostgreSQL 版本字符串添加到对象中?

# SELECT json_object_agg('version', version());
Run Code Online (Sandbox Code Playgroud)

所需的结果可能如下所示:

{
    "uptime": "00:60:01",
    "version": "PostgreSQL 11.7"
}
Run Code Online (Sandbox Code Playgroud)

GMB*_*GMB 5

您可以使用json_build_object()从键/值对生成 JSON 对象。

json_object_agg(
    json_build_object(
        'uptime', date_trunc('second', current_timestamp - pg_postmaster_start_time()),
        'version', version()
    )
)
Run Code Online (Sandbox Code Playgroud)


小智 5

对于聚合查询,示例:

select point_id, json_agg(
    json_build_object(
        'lat', lat,
        'lng', lon
        ))
from raw
group by point_id;
Run Code Online (Sandbox Code Playgroud)

结果:

1,"[{"lat": 66.316917131, "lng": 65.308411872}, {"lat": 66.361430767, "lng": 65.218795224}]"
2,"[{"lat": 53.557419623, "lng": 102.39525849}, {"lat": 53.626151788, "lng": 102.529763433}]"
3,"[{"lat": 56.452206128, "lng": 100.731635684}, {"lat": 56.520627931, "lng": 100.771568911}]"
Run Code Online (Sandbox Code Playgroud)


jja*_*nes 1

json_object_agg 用于聚合,即汇总任意数量的行。

您可以将其用于您的目的,使数据看起来像是多行,每行 2 列。为此,您可以使用 VALUES 列表。

select jsonb_object_agg(key,val) from (
values 
    ('uptime',date_trunc('second', current_timestamp - pg_postmaster_start_time())::text),
    ('version',version())
) foo(key,val);
Run Code Online (Sandbox Code Playgroud)

对于您给出的具体情况,使用带有 4 个参数和一个隐式/虚拟行的 json(b)_build_object 可能更自然。这可能是您目前想要做的所有事情,但如果您正在使用 JSON,您应该知道 json(b)_object_agg 是如何工作的,即使它不是您现在需要的。