Postgresql: 在json数组对象中追加元素
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
提前致谢。
问题原因:在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
进行赋值。如果还不清楚,请考虑提问一个新问题。