Postgresql: 在json数组对象中追加元素

7 浏览
0 Comments

Postgresql: 在json数组对象中追加元素

我在表列中存储了以下的jsonb数据:

'{"info":[

{

"database": "Oracle",

"company" : "Oracle"

},

{

"database":"Sql Server",

"company" :"Microsoft"

},

{

"database":"DB2",

"company" :"IBM"

}

]}'

我需要在json数组中的所有对象末尾添加元素"License" : "Proprietary",如下所示:

'{"info":[
    {
        "database": "Oracle",
        "company" : "Oracle",
        "License" : "Proprietary"
    },
    {
        "database":"Sql Server",
        "company" :"Microsoft",
        "License" : "Proprietary"
    },
    {
        "database":"DB2",
        "company" :"IBM",
        "License" : "Proprietary"
    }
]}'

我在这里添加了SQL Fiddle链接:https://dbfiddle.uk/?rdbms=postgres_11&fiddle=3990e79140df1c897aac2fb19364d2e9

提前致谢。

0
0 Comments

问题原因:在Postgresql中,要向json数组对象中添加元素,需要对每个数组元素分别调用set_jsonb函数,并使用jsonb_array_elements函数获取值,然后使用jsonb_agg函数将其聚合回一个json数组。

解决方法:

UPDATE test
SET data = jsonb_set(data, '{info}', (
  SELECT jsonb_agg(el || '{"License" : "Proprietary"}')
  FROM jsonb_array_elements(data -> 'info') el
));

如果没有表,而是在一个变量中包含了上述的对象数组,那么如何向数组中的每个对象添加一个新元素,并将其存储到一个新的变量中的存储过程中?

明白了我的答案中的代码如何工作吗?如果只想要一个数组,可以省略处理包装对象的部分。至于在存储过程中修改变量,只需使用子查询或SELECT INTO进行赋值。如果还不清楚,请考虑提问一个新问题。

可以在stackoverflow.com/questions/69073612/…上寻求帮助。

0