在Postgres中记录记录时如何合并现有的jsonb字段?

时间:2017-06-06 16:57:01

标签: postgresql jsonb

假设我在Postgres上有一个包含{"a": 1, "b": 2}的jsonb列的表。现在,我想要使用与jsonb列值相同的id和{"b": 10, "c": 20}来记录一条记录。

因此,我希望行的jsonb字段包含{"a": 1, "b": 10, "c": 20}。如何实现这一目标?

3 个答案:

答案 0 :(得分:3)

如果您想要" upsert",可以使用insert ... on conflict...

执行此操作
insert into the_table (id, json_column)
values (1, '{"b": 10, "c": 20}'::jsonb)
on conflict (id) do update
   set json_column = table_name.json_column || excluded.json_column;

答案 1 :(得分:2)

如果连接2个jsonb值,则可以实现所需,例如:

select '{"a": 1, "b": 2}'::jsonb  || '{"b": 10, "c": 20}'::jsonb 

生成:"{"a": 1, "b": 10, "c": 20}"

  

如果两个操作数都是具有公共键字段名称的对象,则结果中字段的值将只是右手操作数中的值。

https://www.postgresql.org/docs/current/static/functions-json.html

答案 2 :(得分:0)

好吧,我的示例不是关于合并2个json字段,而是数组:

insert into tag_lists (article_id, tags) values (1, '{job}')
on conflict (article_id)
do update set tags = (
  select array_agg(distinct x) from unnest(tag_lists.tags || excluded.tags) x
);

感谢此answer提供了全面的摘要