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

lmyy7pcs  于 2023-04-20  发布在  PostgreSQL
关注(0)|答案(4)|浏览(139)

For versions less than 9.5 see this question

我在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);

现在我想要的是

*add类似于 append_to_json_array 的函数接受实际的jsondata,它是一个json-array和我必须添加到jsondata数组的newString,这个函数应该返回更新后的json-array。

UPDATE jsontesting
SET jsondata=append_to_json_array(jsondata, 'newString')
WHERE id = 7;

*remove从json数据数组中删除一个值,一个用于删除该值的函数。

我试图搜索PostgreSQL的文档,但没有找到任何东西。

fbcarpbf

fbcarpbf1#

使用JSON数组append opperator(||)添加值

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;
jhiyze9q

jhiyze9q2#

为了补充Evan卡罗尔的答案,如果列是NULL,您可能需要执行以下操作以将列设置为空数组。如果列当前为NULL,则追加运算符(||)不执行任何操作。

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

gjmwrych3#

我在postgres中使用新的键值对追加到现有的json数据时遇到了类似的问题。我能够使用append操作符||解决这个问题,如下所示:

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

bkhjykvo4#

**- replace(update)**json数据数组中的一个值(将'oldString'替换为'newString'):

UPDATE jsontesting
SET jsondata = (jsondata || '["newString"]'::jsonb)::jsonb - 'oldString'
WHERE jsondata ? 'oldString'

相关问题