簡體   English   中英

postgres如何向jsonb數組中的dicts添加一個鍵

[英]postgres how to add a key to dicts in a jsonb array

我在 jsonb 列中有一個字典數組。 我必須更新並為這個數組中的所有字典添加一個鍵。 這可以在單個更新語句中完成嗎?

Jsonb 列:

select '[{"a":"val1"}, {"b":"val2"}, {"c":"val3"}]'::jsonb;

如何將其更新為:

[
    {
        "a": "val1",
        "x": "xval1"
    },
    {
        "b": "val2",
        "x": "xval2"
    },
    {
        "c": "val3",
        "x": "xval3"
    }
]

首先jsonb_array_elements_text() function 可用於jsonb數據的元素,然后regexp_replace()可用於在子查詢中獲取具有公共鍵( "x" )的新jsonb對象。

在下一步中, replace() function 與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:]]'模式就足夠了,如果數據的鍵值超過一個字母,則添加加號

假設您的 dicts 有一個且只有一個鍵:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM