在 PostgreSQL 中将多个 JSON 行组合成一个 JSON 对象

Combine multiple JSON rows into one JSON object in PostgreSQL

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

{"Salary": ""}
{"what is your name?": ""}
{"what is your lastname": ""}

预期输出

{
  "Salary": "",
  "what is your name?": "",
  "what is your lastname": ""
}

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

select jsonb_object_agg(t.k, t.v)
from the_table, jsonb_each(ob) as t(k,v);

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

select jsonb_object_agg(t.k, t.v)
from the_table, jsonb_each(ob::jsonb) as t(k,v);

一个稍微更优雅的解决方案是定义一个新的聚合来执行此操作:

CREATE AGGREGATE jsonb_combine(jsonb) 
(
    SFUNC = jsonb_concat(jsonb, jsonb),
    STYPE = jsonb
);

然后你可以直接聚合值:

select jsonb_combine(ob)
from the_table;

(如果它是 json 而不是 jsonb,您需要再次转换您的专栏)

Online example