如何在 PostgreSQL 12 中将元素添加到 jsonb 数组中?

问题描述 投票:0回答:2

示例:

drop table a;
create table a( value jsonb);
insert into a values ('{"items":[0,1,2]}'::jsonb);
select value->'items' from a;

我已经知道如何附加到数组。例如:

select jsonb_build_object('items', 
        value->'items' || '3'::jsonb
)  from a

返回:

{"items": [0, 1, 2, 3]}

但我不知道如何preprededinsert将元素插入数组中。

例如:

select jsonb_build_object('items', 
        jsonb_array_insert(value->'items',0,-1)
)  from a

这将返回:

{"items": [-1, 0, 1, 2]}

但是没有

jsonb_array_insert
功能。 https://www.postgresql.org/docs/12/functions-json.html(表 9.45.其他 jsonb 运算符)的文档描述了一些有用的 jsonb 运算符,但它们都不能用于插入/前置元素.

嗯,

jsonb_array_elements(value->'items')
可用于将数组转换为一组元素。但我不知道如何使用它在数组中插入/添加元素。

我可以为此编写自己的 PL/SQL 函数,但一定有更好的方法!

arrays postgresql jsonb
2个回答
2
投票

您可以使用

JSONB_INSERT
来实现您想要的。请参阅文档

试试这个方法:

select 
jsonb_insert(value,'{items,0}','-1'::jsonb)
from a

此功能完全按照您的要求工作。


0
投票

您可能已经想到了这一点,但您也可以使用串联运算符,只需通过切换操作数的顺序即可将元素添加到 jsonb 数组中(请注意,为了使串联在这种情况下起作用,右侧操作数需要用括号括起来):

select jsonb_build_object('items',
        '-1'::jsonb || (value->'items')
)  from a;

返回:

{"items": [-1, 0, 1, 2]}

此方法的一个好处是您可以使用它一次添加多个元素:

select jsonb_build_object('items',
        '[-2, -1]'::jsonb || (value->'items')
)  from a;

返回:

{"items": [-2, -1, 0, 1, 2]}

这不能处理您想要在任意索引处插入元素的情况。

© www.soinside.com 2019 - 2024. All rights reserved.