在 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
,您需要再次转换您的专栏)
我想将多行中的以下 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
,您需要再次转换您的专栏)