PostgreSQL 中将多个 JSON 行合并为一个 JSON 对象

Dev*_*tam 1 postgresql json postgresql-9.5

我想将多行中的以下 JSON 组合成一个单一的 JSON 对象作为一行。

{"Salary": ""}
{"what is your name?": ""}
{"what is your lastname": ""}
Run Code Online (Sandbox Code Playgroud)

预期输出

{
  "Salary": "",
  "what is your name?": "",
  "what is your lastname": ""
}
Run Code Online (Sandbox Code Playgroud)

a_h*_*ame 8

仅使用内置函数,您需要将行扩展为键/值对并将其聚合回单个 JSON 值:

select jsonb_object_agg(t.k, t.v)
from the_table, jsonb_each(ob) as t(k,v);
Run Code Online (Sandbox Code Playgroud)

如果您的列是类型json而不是jsonb您需要强制转换它:

select jsonb_object_agg(t.k, t.v)
from the_table, jsonb_each(ob::jsonb) as t(k,v);
Run Code Online (Sandbox Code Playgroud)

一个稍微优雅的解决方案是定义一个新的聚合来做到这一点:

CREATE AGGREGATE jsonb_combine(jsonb) 
(
    SFUNC = jsonb_concat(jsonb, jsonb),
    STYPE = jsonb
);
Run Code Online (Sandbox Code Playgroud)

然后你可以直接聚合这些值:

select jsonb_combine(ob)
from the_table;
Run Code Online (Sandbox Code Playgroud)

(同样,如果它json不是,则您需要投射您的专栏jsonb

在线示例