![](/img/trans.png)
[英]How to get value of a key inside an jsonb array in postgres and JOIN
[英]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.