Postgresql Postgres jsonb_集-在大于当前数组的索引处添加数组元素
我试图在Postgres中向jsonb数组添加元素 我事先知道每个元素将有什么索引,但我不知道:Postgresql Postgres jsonb_集-在大于当前数组的索引处添加数组元素,postgresql,jsonb,Postgresql,Jsonb,我试图在Postgres中向jsonb数组添加元素 我事先知道每个元素将有什么索引,但我不知道: 我将按什么顺序添加元素 元素的总数是多少 例如,如果最终的数组是[0,1,2,3,4](为了简单起见,其值对应于索引),则可以按照0,1,3,2,4或4,3,2,1,0等顺序添加元素-这是随机的,我只是等待元素通过并添加它们-我不知道会提前添加多少个元素 所以我想做的是在每个元素的特定索引处添加每个元素,但是在使用json\u set 要在特定索引处设置元素,我将使用以下方法: 选择jsonb_
- 我将按什么顺序添加元素
- 元素的总数是多少
[0,1,2,3,4]
(为了简单起见,其值对应于索引),则可以按照0,1,3,2,4
或4,3,2,1,0
等顺序添加元素-这是随机的,我只是等待元素通过并添加它们-我不知道会提前添加多少个元素
所以我想做的是在每个元素的特定索引处添加每个元素,但是在使用json\u set
要在特定索引处设置元素,我将使用以下方法:
选择jsonb_集('[0,1,2]','{0}',3',true)
返回[3,1,2]
所以这种情况很好——但是,当我想在当前数组超出边界的索引处设置元素时,它不是在数组中创建空白,而是在新创建的索引中将元素追加到末尾
这样就可以了(将元素@index 3添加到长度3数组中)
选择jsonb_集('[0,1,2]','{3}',3',true)
返回[0,1,2,3]
但事实并非如此(将元素@index 5添加到长度为3的数组中)
选择jsonb_集('[0,1,2]','{5}',5',true)
返回[0,1,2,5]
我希望它是[0,1,2,未定义,未定义,5]
有没有办法让它发挥作用?我真的不在乎空白值是什么,可以是
未定义的,空的或一些占位符值。我只想能够在任何索引处插入元素,并让Postgres为我创建一个新的更大的数组。该行为在(页面末尾的一个注释)中进行了解释:
[…]如果项目超出范围-数组长度。。array_length-1,如果create_missing为true,则新值将添加到数组的开头(如果项为负数),如果项为正数,则添加到数组的末尾
创建自己的功能:
create or replace function jsonb_set_element(jsonb, int, jsonb)
returns jsonb language plpgsql as $$
begin
while jsonb_array_length($1) < $2 loop
$1 := $1 || '[null]'::jsonb;
end loop;
return jsonb_set($1, array[$2::text], $3, true);
end $$;
select
jsonb_set_element('[0,1,2]', 0, '9') as test_0,
jsonb_set_element('[0,1,2]', 3, '3') as test_3,
jsonb_set_element('[0,1,2]', 5, '5') as test_5
test_0 | test_3 | test_5
-----------+--------------+--------------------------
[9, 1, 2] | [0, 1, 2, 3] | [0, 1, 2, null, null, 5]
(1 row)