如何在不创建新对象的情况下在jsonb中添加新的键值对?(博士后)
我需要在现有的json对象中添加一个新的键值对。谢谢你的帮助 json:如何在不创建新对象的情况下在jsonb中添加新的键值对?(博士后),json,postgresql,jsonb,Json,Postgresql,Jsonb,我需要在现有的json对象中添加一个新的键值对。谢谢你的帮助 json: { “json_col”:[ { “瓦尔1”:1, “val2”:0, “val3”:“qwe” } ] } 我提出了这个问题 UPDATE table SET json_col = jsonb_set( json_col, '{json_col}', json_col->'json_col' || '{"test":123}')) where id=6400 它将输出:
{
“json_col”:[
{
“瓦尔1”:1,
“val2”:0,
“val3”:“qwe”
}
]
}
我提出了这个问题
UPDATE table SET
json_col = jsonb_set(
json_col,
'{json_col}', json_col->'json_col' || '{"test":123}'))
where id=6400
它将输出:
{
“json_col”:[
{
“瓦尔1”:1,
“val2”:0,
“val3”:“qwe”
},
{
“测试”:123
}
]
}
但是我需要这个json是一个单独的对象(没有额外的括号),如下所示:
{
“json_col”:[
{
“瓦尔1”:1,
“val2”:0,
“val3”:“qwe”,
“测试”:123
}
]
}
您的语法基本正确,只需更正路径
为jsonb\u集提供的值
,并提取json\u col
元素的第一个元素:
UPDATE some_table SET
json_col = jsonb_set(
json_col::jsonb,
'{json_col,0}',
(json_col->'json_col'->0)||'{"test":123}'
)::json
where id=6400;
您可以在以下设备上进行测试:
数组中的多个元素
如果您的json\u col
数组包含多个元素,并且您希望使用相同的key:value对更新其中的每一个元素,那么您应该使用以下查询:
UPDATE some_table SET
json_col = jsonb_set(
json_col,
'{json_col}',
(SELECT jsonb_agg(elem||'{"test":123}')
FROM jsonb_array_elements( json_col->'json_col') AS elem )
)
where id=6400;
您的PostgreSQL server的版本是什么?json_col是一个数组-你想更新哪个元素?@JuliusTuskenis 12.6,是的,没错,我想更新对象,它是json_col数组中的一个元素。数组中可能有几个元素。那么你想更新哪个元素:数组中的一个特定元素还是所有元素?这个数组中只有一个元素,所以我只想更新一个元素很好,很好,谢谢,但我错了-数组中可以有多个元素,那么在多个元素的情况下它应该是什么样子呢?更新了答案。实际上键是相同的,但是值是不同的。因此,您必须将键值的源连接到
jsonb_数组_元素(json_col->'json_col')作为elem
part,然后使用jsonb_build_对象,而不是常量“{”test:123}”。如果您想要完整的示例,您应该提供构建测试用例所需的所有数据(最好是SQL语句形式)和预期结果。