簡體   English   中英

使用 postgres 更新數組 jsonb 中元素的 object 字段

[英]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

演示 1

更新:為了更新數組中的多個元素,可能首選使用以下包含嵌套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"}]}';

演示 2

暫無
暫無

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

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