Sql postgres介绍如何向jsonb数组中的dicts添加键
我在jsonb列中有一个dict数组。我必须更新并向该数组中的所有dict添加一个键。这可以在单个update语句中完成吗 Jsonb列:Sql postgres介绍如何向jsonb数组中的dicts添加键,sql,json,postgresql,sql-update,jsonb,Sql,Json,Postgresql,Sql Update,Jsonb,我在jsonb列中有一个dict数组。我必须更新并向该数组中的所有dict添加一个键。这可以在单个update语句中完成吗 Jsonb列: select '[{"a":"val1"}, {"b":"val2"}, {"c":"val3"}]'::jsonb; 如何将其更新为: [ { "a": "val1", "x": "xval1" }, { "b": "val2", "x": "xval2" }
select '[{"a":"val1"}, {"b":"val2"}, {"c":"val3"}]'::jsonb;
如何将其更新为:
[
{
"a": "val1",
"x": "xval1"
},
{
"b": "val2",
"x": "xval2"
},
{
"c": "val3",
"x": "xval3"
}
]
首先可以使用
jsonb\u array\u elements\u text()
函数取消对jsonb
数据的元素的测试,然后可以应用regexp\u replace()
在子查询中获得具有公共键(“x”
)的新jsonb
对象
在下一步中,replace()
函数与jsonb_agg()
将产生如下查询中所示的所需结果:
select id,
jsonb_agg(
(replace(jj.value,'}',',')||replace(jsonb_set(value2::jsonb, '{x}',
('"x'||(jj.value2::jsonb->>'x')::text||'"')::jsonb)::text,'{',''))::jsonb
)
as result
from
(
select t.id, j.value, regexp_replace(j.value,'[[:alpha:]]+','x') as value2
from t
cross join jsonb_array_elements_text(jsdata) j
) jj
group by id;
事实上,对
regexp\u replace
使用'[[:alpha:][]]
模式就足够了,在数据具有多个字母的键值的情况下添加加号。首先jsonb\u array\u elements\u text()
函数可能用于取消对jsonb
数据的元素的测试,然后可以应用regexp\u replace()
来获取子查询中具有公共键(“x”
)的新jsonb
对象
在下一步中,replace()
函数与jsonb_agg()
将产生如下查询中所示的所需结果:
select id,
jsonb_agg(
(replace(jj.value,'}',',')||replace(jsonb_set(value2::jsonb, '{x}',
('"x'||(jj.value2::jsonb->>'x')::text||'"')::jsonb)::text,'{',''))::jsonb
)
as result
from
(
select t.id, j.value, regexp_replace(j.value,'[[:alpha:]]+','x') as value2
from t
cross join jsonb_array_elements_text(jsdata) j
) jj
group by id;
事实上,对
regexp_replace
使用'[[:alpha:]].
模式就足够了,在数据包含多个字母的键值的情况下添加加号。假设您的DICT有一个且只有一个键:
update your_table set
jsonb_col = (
select jsonb_agg(
v || jsonb_build_object(
'x',
'x' || (v->>(select min(x) from jsonb_object_keys(v) as x))))
from jsonb_array_elements(jsonb_col) as v);
假设您的DICT只有一个键:
update your_table set
jsonb_col = (
select jsonb_agg(
v || jsonb_build_object(
'x',
'x' || (v->>(select min(x) from jsonb_object_keys(v) as x))))
from jsonb_array_elements(jsonb_col) as v);