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

Eva*_*oll 24 arrays postgresql array-push jsonb postgresql-9.5

对于小于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);
Run Code Online (Sandbox Code Playgroud)

现在我想要的是

  • 添加append_to_json_array这样的东西,实际的jsondata是一个json数组,而newString是我必须添加到jsondata数组的,这个函数应该返回更新的json数组.

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

我试图搜索PostgreSQL的文档,但没有发现任何内容.

Eva*_*oll 55

要添加值,请使用JSON数组追加opperator(||)

UPDATE jsontesting
SET jsondata = jsondata || '["newString"]'::jsonb
WHERE id = 7;
Run Code Online (Sandbox Code Playgroud)

删除值如下所示

UPDATE jsontesting
SET jsondata = jsondata - "newString"
WHERE id = 7; 
Run Code Online (Sandbox Code Playgroud)

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

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


小智 12

我遇到了类似的问题,需要使用新的键值对附加到 postgres 中的现有 json 数据。我能够使用附加运算符修复此问题,|| 如下所示:

UPDATE jsontesting
SET jsondata = jsondata::jsonb || '{"add_new_data": true}'
WHERE id = 7;
Run Code Online (Sandbox Code Playgroud)


win*_*toy 9

要添加到Evan Carroll的答案,您可能需要执行以下操作将列设置为空数组(如果是)NULL.||如果列是当前的,则append运算符()不执行任何操作NULL.

UPDATE jsontesting SET jsondata = (
    CASE
        WHEN jsondata IS NULL THEN '[]'::JSONB
        ELSE jsondata
    END
) || '["newString"]'::JSONB WHERE id = 7;
Run Code Online (Sandbox Code Playgroud)

  • 这应该是最佳答案......我想知道为什么它仍然为空,我怀疑这一点。先生投一票。 (6认同)
  • @RTW`SET jsondata = COALESCE(jsondata,'[]':: JSONB)|| '[“ newString”]':: JSONB` (3认同)
  • 我要么使用合并,要么将其写入条件。 (2认同)
  • @RTW:postgresql 等有一个名为 [coalesce](https://www.postgresql.org/docs/current/functions-conditional.html#FUNCTIONS-COALESCE-NVL-IFNULL) 的内置函数,它的作用与此相同案例表达。 (2认同)