[英]Update object field of element in array jsonb with postgres
我有以下 jsonb 列,其名稱是我的 sql 表中的數據。
{
"special_note": "Some very long special note",
"extension_conditions": [
{
"condition_id": "5bfb8b8d-3a34-4cc3-9152-14139953aedb",
"condition_type": "OPTION_ONE"
},
{
"condition_id": "fbb60052-806b-4ae0-88ca-4b1a7d8ccd97",
"condition_type": "OPTION_TWO"
}
],
"floor_drawings_file": "137c3ec3-f078-44bb-996e-161da8e20f2b",
}
我需要做的是將extension_conditions數組字段中名稱為condition_type的每個對象的字段從 OPTION_ONE 更新為 MARKET_PRICE 並且 OPTION_TWO 保持不變。
考慮到這個extension_conditions數組字段是可選的,所以我需要過濾extension_conditions為 null 的行
我需要一個查詢,它將通過上述規則更新該表的所有行的 jsonb 列。
提前致謝!
在確定數組中相關鍵的位置(索引)后,您可以使用包含JSONB_SET()
function 這樣的語句
WITH j AS
(
SELECT ('{extension_conditions,'||idx-1||',condition_type}')::TEXT[] AS path, j
FROM tab
CROSS JOIN JSONB_ARRAY_ELEMENTS(data->'extension_conditions')
WITH ORDINALITY arr(j,idx)
WHERE j->>'condition_type'='OPTION_ONE'
)
UPDATE tab
SET data = JSONB_SET(data,j.path,'"MARKET_PRICE"',false)
FROM j
更新:為了更新數組中的多個元素,可能首選使用以下包含嵌套JSONB_SET()
的查詢
UPDATE tab
SET data =
(
SELECT JSONB_SET(data,'{extension_conditions}',
JSONB_AGG(CASE WHEN j->>'condition_type' = 'OPTION_ONE'
THEN JSONB_SET(j, '{condition_type}', '"MARKET_PRICE"')
ELSE j
END))
FROM JSONB_ARRAY_ELEMENTS(data->'extension_conditions') AS j
)
WHERE data @> '{"extension_conditions": [{"condition_type": "OPTION_ONE"}]}';
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.