我有一個 Postgres 11.12 資料庫,其中有一個名為workflows_emails
json 列的表to。該to列具有以下格式:
[
{
"type":"employee",
"assignment":{
"..."
}
},
{
"type":"external",
"email":"[email protected]"
}
]
我想更新 json 陣列以混淆email欄位所在的所有物體中的type欄位external。結果陣列看起來像:
[
{
"type":"employee",
"assignment":{
"..."
}
},
{
"type":"external",
"email":"[email protected]"
}
]
有沒有辦法用 Postgres 查詢來做到這一點?
uj5u.com熱心網友回復:
假設您的workflows_emails表有一個id主鍵列,您可以通過運行以下更新來更新陣列中適當的 JSON 物件:
update workflows_emails set "to" = new_to.new_to
from (
select id,
json_agg(
case
when element ->> 'type' = 'external' then
jsonb_set(element, '{email}', to_jsonb(element ->> 'email' || '.SBX'))
else element
end
) as new_to
from workflows_emails,
jsonb_array_elements("to") as element
group by id
) new_to
where new_to.id = workflows_emails.id
中的子查詢new_to迭代 JSON 陣列中的元素并轉換物件 where typeis external。迭代是通過解包 JSON 陣列來完成的,jsonb_array_elements這樣我們就可以評估單個元素的條件和轉換。在對適當的元素進行轉換后,我們使用 重新創建 JSON 陣列json_agg。對于轉換,我們使用jsonb_set,它將email現有 JSON 物件的欄位設定為新值。
然后使用子查詢的結果來更新原始表的"to"列。
您可以在dbfiddle上看到結果。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/535284.html
標籤:postgresql
