Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在不创建新对象的情况下在jsonb中添加新的键值对?(博士后)_Json_Postgresql_Jsonb - Fatal编程技术网

如何在不创建新对象的情况下在jsonb中添加新的键值对?(博士后)

如何在不创建新对象的情况下在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对象中添加一个新的键值对。谢谢你的帮助

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”
},
{
“测试”: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语句形式)和预期结果。