Postgresql 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_

我试图在Postgres中向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)