postgres:如何改变数组中每个元素的jsonb值类型?

rqdpfwrv  于 2021-08-09  发布在  Java
关注(0)|答案(1)|浏览(278)

我在postgres 10.12中有一个名为items的jsonb列,如下所示:

{
    "items": [
        {
            "itemQty": 2,
            "itemName": "snake"
        },
        {
            "itemQty": 1,
            "itemName": "x kodiyum"
        }
    ]
}

现在我要将每个数组元素的itemqty类型转换为string,以便新值如下所示:

{
    "items": [
        {
            "itemQty": "2",
            "itemName": "snake"
        },
        {
            "itemQty": "1",
            "itemName": "x kodiyum"
        }
    ]
}

我该怎么做?我已经浏览了postgresjsonb的文档,但无法理解。
在服务器端,如果有帮助的话,我将使用spring boot和hibernate with com.vladmihalcea.hibernate.type.json(hibernate types 52)。
谢谢

zzlelutf

zzlelutf1#

您可以取消对数组的嵌套,修改元素,然后重新生成它。假设表的主键是 id ,即:

select jsonb_build_object(
    'items', jsonb_agg(
        jsonb_build_object(
            'itemQty',  (x.obj ->> 'itemQty')::text,
            'itemName', x.obj ->> 'Name'
        )
    ) 
    )new_items
from mytable t
cross join lateral jsonb_array_elements(t.items -> 'items') as x(obj)
group by id

请注意,显式强制转换为 ::text 在这里不是真的需要 ->> 无论如何提取文本值:我保留它是因为它使意图更清晰。
如果你想要一个 update 声明:

update mytable t
set items = (
    select jsonb_build_object(
        'items', jsonb_agg(
            jsonb_build_object(
                'itemQty',  (x.obj ->> 'itemQty')::text,
                'itemName', x.obj ->> 'Name'
            )
        ) 
    )
    from jsonb_array_elements(t.items -> 'items') as x(obj)
)

db小提琴演示

相关问题