在 PostgreSQL 9.5+ 的 JSON 数组中追加(推送)和删除

问题描述 投票:0回答:4

低于 9.5 的版本请看这个问题

我使用这个在 PostgreSQL 中创建了一个表:

CREATE TEMP TABLE jsontesting
AS
  SELECT id, jsondata::jsonb FROM ( VALUES
    (1, '["abra","value","mango", "apple", "sample"]'),
    (2, '["japan","china","india", "russia", "australia"]'),
    (3, '["must", "match"]'),
    (4, '["abra","value","true", "apple", "sample"]'),
    (5, '["abra","false","mango", "apple", "sample"]'),
    (6, '["string","value","mango", "apple", "sample"]'),
    (7, '["must", "watch"]')
  ) AS t(id,jsondata);

现在我想要的是

  • addappend_to_json_array这样的东西接受实际的jsondata,它是一个json数组和我必须添加到那个jsondata数组的newString,这个函数应该返回更新的json数组。

    UPDATE jsontesting
    SET jsondata=append_to_json_array(jsondata, 'newString')
    WHERE id = 7;
    
  • 从 json 数据数组中删除 一个值,一个用于删除值的函数。

我试图搜索 PostgreSQL 的文档,但在那里一无所获。

arrays postgresql jsonb postgresql-9.5 array-push
4个回答
147
投票

要添加值,请使用 JSON 数组追加运算符 (

||
)

UPDATE jsontesting
SET jsondata = jsondata || '["newString"]'::jsonb
WHERE id = 7;

删除值看起来像这样

UPDATE jsontesting
SET jsondata = jsondata - 'newString'
WHERE id = 7; 

连接到嵌套字段看起来像这样

UPDATE jsontesting
SET jsondata = jsonb_set(
  jsondata::jsonb,
  array['nestedfield'],
  (jsondata->'nestedfield')::jsonb || '["newString"]'::jsonb) 
WHERE id = 7;

41
投票

要添加到 Evan Carroll 的答案,您可能需要执行以下操作以将列设置为空数组(如果它是

NULL
)。如果该列当前为
||
.
,则追加运算符(
NULL

)不执行任何操作
UPDATE jsontesting SET jsondata = (
    CASE
        WHEN jsondata IS NULL THEN '[]'::JSONB
        ELSE jsondata
    END
) || '["newString"]'::JSONB WHERE id = 7;

7
投票

我在用新的键值对附加到 postgres 中现有的 json 数据时遇到了类似的问题。 我能够使用附加运算符

||
解决此问题,如下所示:

UPDATE jsontesting
SET jsondata = jsondata::jsonb || '{"add_new_data": true}'
WHERE id = 7;

0
投票

- 替换(更新) json 数据数组中的值(将“oldString”替换为“newString”):

UPDATE jsontesting
SET jsondata = (jsondata || '["newString"]'::jsonb)::jsonb - 'oldString'
WHERE jsondata ? 'oldString'
© www.soinside.com 2019 - 2024. All rights reserved.