【问题标题】:Delete objects inside NESTED JSONB arrays with PostgreSQL使用 PostgreSQL 删除 NESTED JSONB 数组中的对象
【发布时间】:2019-12-15 12:44:25
【问题描述】:

json 请求:

INSERT INTO test.demotbl (data)
VALUES ('{
    "x1": "Americas",
    "x2": "West",
    "x3": [{
        "x_id": "sam"
    }],
    "x4": {
        "a1": true,
        "a2": false,
        "a3": [
            "xx",
            "xx"
        ],
        "a4": [
            "Josh"
        ],
        "y1": [{
                "id": "RW",
                "z2": true,
                "z3": "USER",
                "z4": [{
                    "name": "john"
                }]
            },
             {
                "id": "RO",
                "z2": false,
                "z3": "SELECT",
                "z4": [{
                    "name": "salin"
                }
            {
                "id": "DBA",
                "z2": false,
                "z3": "SELECT",
                "z4": [{
                    "name": "Samule"
                }]
            }
        ]
    }
}'::jsonb)

问题 1:如何从 y1 数组中删除 "id":"RO" 的数组值? y1 json数组中可以有任何元素我想根据id条件删除数组值。

如何从 y1 数组中删除 "id":"RO" 的数组值? y1 json数组中可以有任何元素我想根据id条件删除数组值。

删除后的预期输出:

{
    "x1": "Americas",
    "x2": "West",
    "x3": [{
        "x_id": "sam"
    }],
    "x4": {
        "a1": true,
        "a2": false,
        "a3": [
            "xx",
            "xx"
        ],
        "a4": [
            "Josh"
        ],
        "y1": [{
                "id": "RW",
                "z2": true,
                "z3": "USER",
                "z4": [{
                    "name": "john"
                }]
            },

            {
                "id": "DBA",
                "z2": false,
                "z3": "SELECT",
                "z4": [{
                    "name": "Samule"
                }]
            }
        ]
    }
}

问题 2:如何只从 y1 数组中删除 "id":"RO"

预期输出:

{
    "x1": "Americas",
    "x2": "West",
    "x3": [{
        "x_id": "sam"
    }],
    "x4": {
        "a1": true,
        "a2": false,
        "a3": [
            "xx",
            "xx"
        ],
        "a4": [
            "Josh"
        ],
        "y1": [{
                "id": "RW",
                "z2": true,
                "z3": "USER",
                "z4": [{
                    "name": "john"
                }]
            },
             {
                "z2": false,
                "z3": "SELECT",
                "z4": [{
                    "name": "salin"
                }
            {
                "id": "DBA",
                "z2": false,
                "z3": "SELECT",
                "z4": [{
                    "name": "Samule"
                }]
            }
        ]
    }
}

【问题讨论】:

    标签: postgresql jsonb


    【解决方案1】:

    编辑说明:我误解了这个问题。以为您想删除包含“RO”的整个对象。我编辑了答案,只是为了删除 id。

    您提供的 jsonb 对象有一个小错误。它应该看起来像这样:

    {
        "x1": "Americas",
        "x2": "West",
        "x3": [{
            "x_id": "sam"
        }],
        "x4": {
            "a1": true,
            "a2": false,
            "a3": [
                "xx",
                "xx"
            ],
            "a4": [
                "Josh"
            ],
            "y1": [{
                    "id": "RW",
                    "z2": true,
                    "z3": "USER",
                    "z4": [{
                        "name": "john"
                    }]
                },
                 {
                    "id": "RO",
                    "z2": false,
                    "z3": "SELECT",
                    "z4": [{
                        "name": "salin"
                    }]
                },
                {
                    "id": "DBA",
                    "z2": false,
                    "z3": "SELECT",
                    "z4": [{
                        "name": "Samule"
                    }]
                }
            ]
        }
    }
    

    话虽如此,这应该可行,但请记住 - 这将替换工作表中的所有条目。 jsonb 对象位于“字段”字段中。

    with zd as (select ('{x4,y1,'||index-1||',id}')::text[] as path
                from table
                ,jsonb_array_elements((field->>'x4')::jsonb->'y1') 
                with ordinality arr(x,index)
                where x->>'id'='RO'
            )
            update table set field=
            field #- zd.path 
            from zd
    

    最好的问候,
    比亚尼

    【讨论】:

    • 感谢@Bjarni Ragnarsson 解决了问题 2。对于问题 1,我想删除整个 this 值 ==> { "id": "RO", "z2": false, "z3" : "SELECT", "z4": [{ "name": "salin" }
    • 是的,我想删除包含“RO”的整个对象,这是我的第一个问题。第二个问题是删除您提供的解决方案的“id”:“RO” :)
    • 好的。要删除整个对象,请将 "with zd as (select ('{x4,y1,'||index-1||',id}')::text[] as path" 替换为 "with zd as (select ( '{x4,y1,'||index-1||'}')::text[] as path"。
    • 真棒解决它。再次感谢@Bjarni Ragnarsson 的解决方案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-02
    • 2020-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-03
    相关资源
    最近更新 更多