【问题标题】:Update object field of element in array jsonb with postgres使用 postgres 更新数组 jsonb 中元素的对象字段
【发布时间】:2021-02-02 18:05:53
【问题描述】:

我的 sql 表中有以下名称为 data 的 jsonb 列。

{
    "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 为空的行

我需要一个查询,该查询将按照上述规则更新此表的所有 jsonb 行列。

提前致谢!

【问题讨论】:

    标签: sql json postgresql jsonb


    【解决方案1】:

    在确定数组中相关键的位置(索引)后,可以使用这样的包含JSONB_SET()函数的语句

    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
    

    Demo 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"}]}';
    

    Demo 2

    【讨论】:

    • 它工作正常,但这个查询只更新数组的第一个元素。我有一个动态数组,它可以包含两个具有 OPTION_ONE 值的元素,如何更新它们?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-06
    • 1970-01-01
    • 2022-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多