Sql postgres介绍如何向jsonb数组中的dicts添加键

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" }

我在jsonb列中有一个dict数组。我必须更新并向该数组中的所有dict添加一个键。这可以在单个update语句中完成吗

Jsonb列:

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);