在Postgres中向JSON对象添加元素

the*_*ebe 18 string postgresql select json replace

我在数据库(postgres 9.2.1)中有一个文本字段,其中包含一个json blob.它看起来与此类似,除了所有在一行上,显然:

{
  "keyword": {
    "checked": "1",
    "label": "Keyword"
  },
  "agency_name": {
    "checked": "0",
    "label": "Agency Name"
  }
}
Run Code Online (Sandbox Code Playgroud)

我需要向json数组添加一个元素,使它看起来像这样:

{
  "keyword": {
    "checked": "1",
    "label": "Keyword"
  },
  "something_new": {
    "checked": "1",
    "label": "Something New"
  },
  "agency_name": {
    "checked": "0",
    "label": "Agency Name"
  }
}
Run Code Online (Sandbox Code Playgroud)

我并不关心新数组元素的位置.它可以在agency_name之后.在postgres中有一个简单的方法吗?

New*_*Bee 15

如果升级到PG9.5.1,那么可以使用sql操作||来合并jsonb,例如

select '{"a":1}'::jsonb || '{"a":2, "b":2}'::jsonb
Run Code Online (Sandbox Code Playgroud)

将返回 {"a": 2, "b": 2}

如果你不能升级到pg9.5.1,恕我直言,在你的代码中完成工作将是一个更好的选择.您可以将旧的jsonb字符串解析为映射,然后更新映射,然后转换为字符串并更新db-record.


Dhr*_*ker 6

即使我遇到同样的问题,我也想动态地将新元素附加到jsonb [].

假设column_jsonb [] = [{"name":"xyz","age":"12"}]

UPDATE table_name
   SET column_jsonb[] = array_append(column_jsonb[],'{"name":"abc","age":"22"}');
Run Code Online (Sandbox Code Playgroud)

结果:[{"name":"xyz","age":"12"},{"name":"abc","age":"22"}]

  • 就算阁下‘也有同样的问题’,那我们还有什么机会呢?哈哈 (4认同)

小智 6

用于||合并jsonb并将其值设置为

例:

起源:

在表中a

id | 信息

1 | {“ aa”:“ bb”}

2 | {“ aa”:“ cc”}

执行后:

update a set info = info::jsonb || ('{"id":}' || id || '}' )::jsonb 
Run Code Online (Sandbox Code Playgroud)

产生:

id | 信息

1 | {“ aa”:“ bb”,“ id”:1}

2 | {“ aa”:“ cc”,“ id”:2}

something_else:

  1. 用于- ‘key’删除jsonb中的元素
  2. 如果两个jsonb具有相同的密钥,则merge将替换原点1


Edm*_*und 5

PostgreSQL还没有很多JSON支持函数:我只能看到它们array_to_json,如果有一种相应的方法可以将原始JSON转换为数组,那么可以使用它,然后你可以操作添加额外的转换回JSON之前的元素.

可能最好的事情是使用PL语言来操纵JSON.一个显而易见的是PLV8,它在PostgreSQL中提供JavaScript编程功能.您将在JavaScript中编写一个用户定义的函数,该函数将相应地操作JSON blob:

当然,许多其他PL语言(如Java,Python或Perl)在处理JSON数据方面也同样出色,并且可能更容易在您的系统上安装.如果设置了用户定义的函数,则可以在每个函数中编写这些函数.

  • 显然不是我想要的答案,但同样令人满意.谢谢. (2认同)