示例:
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]}
但我不知道如何prepreded或insert将元素插入数组中。
例如:
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 函数,但一定有更好的方法!
您可以使用
JSONB_INSERT
来实现您想要的。请参阅文档。
试试这个方法:
select
jsonb_insert(value,'{items,0}','-1'::jsonb)
from a
此功能完全按照您的要求工作。
您可能已经想到了这一点,但您也可以使用串联运算符,只需通过切换操作数的顺序即可将元素添加到 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]}
这不能处理您想要在任意索引处插入元素的情况。