如何在不创建新对象的情况下在 jsonb 中添加新的键值对? (Postgres)
How to add a new key-value pair in jsonb without creating a new object? (Postgres)
我需要将新的键值对添加到现有的 json 对象中。将不胜感激。
json:
{
"json_col": [
{
"val1": 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": [
{
"val1": 1,
"val2": 0,
"val3": "qwe"
},
{
"test": 123
}
]
}
但我需要这个 json 是一个单独的对象(没有额外的括号),像这样:
{
"json_col": [
{
"val1": 1,
"val2": 0,
"val3": "qwe",
"test": 123
}
]
}
您的语法基本上是正确的,您只需更正 path
为 jsonb_set
提供的值并提取 json_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;
您可以在以下时间进行测试:db<>fiddle
数组中的多个元素
如果您的 json_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;
我需要将新的键值对添加到现有的 json 对象中。将不胜感激。
json:
{
"json_col": [
{
"val1": 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": [
{
"val1": 1,
"val2": 0,
"val3": "qwe"
},
{
"test": 123
}
]
}
但我需要这个 json 是一个单独的对象(没有额外的括号),像这样:
{
"json_col": [
{
"val1": 1,
"val2": 0,
"val3": "qwe",
"test": 123
}
]
}
您的语法基本上是正确的,您只需更正 path
为 jsonb_set
提供的值并提取 json_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;
您可以在以下时间进行测试:db<>fiddle
数组中的多个元素
如果您的 json_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;