PostgreSQL -如何追加到二维数组?

bfhwhh0e  于 2023-06-22  发布在  PostgreSQL
关注(0)|答案(2)|浏览(168)

我不知道如何将一组值追加到二维数组中。我已经尝试了concat操作符(||)和array_append()。在向一维数组的末尾追加单个值时,这两种方法似乎都能正常工作,但我花了几个小时搜索并尝试了不同的追加方法。
我正在尝试编写自己的函数,它将接收一个分隔字符串,使用STRING_TO_ARRAY()函数,随后我需要每个元素的位置索引。我还没有找到一个BIF,这样做,所以我不得不创建自己的。所以返回值将是一个二维数组,其中第一个元素是数组索引,第二个元素是值。所以我循环遍历数组,并尝试在每次循环中添加索引和值。
我能找到的最接近的文章是https://popsql.com/learn-sql/postgresql/how-to-modify-arrays-in-postgresql
在作者声明“您甚至可以将数组添加到二维数组中:”的地方,通过方法,

select array[1, 2] || array[[4, 5],[6, 7]] as concat_2d_array;

我模仿它的基本代码块是:

DECLARE 
    x int DEFAULT 0;
    data_arr varchar[];
    return_array varchar[][];
BEGIN
data_arr := string_to_array(IN_ARRAY, IN_DELIMITER, '');
    
FOR x in array_lower(data_arr, 1)..array_upper(data_arr, 1) LOOP
    return_array := ARRAY[return_array] || ARRAY[to_char(x,'fm00000')::varchar, data_arr[x]::varchar];
END LOOP;
    
RETURN return_array;

这似乎在第一次和第二次迭代中起作用,但到了第三次,我得到了“PG_EXCEPTION_DETAIL:3维和1维的数组不兼容串联。"
有些帖子指出数组元素应该用花括号括起来。但这根本无法编译。
一定有个简单的解决办法。我错过了什么?

kknvjkwl

kknvjkwl1#

显然,您可以向2D数组追加

=> SELECT ('{{10,11,12},{20,21,22},{30,31,32}}'::int[][]) || '{40,41,42}'::int[];
┌───────────────────────────────────────────────┐
│                   ?column?                    │
├───────────────────────────────────────────────┤
│ {{10,11,12},{20,21,22},{30,31,32},{40,41,42}} │
└───────────────────────────────────────────────┘
(1 row)

但是你继续说你想要数组元素的索引(因此是2D的)。

=> SELECT * FROM unnest(string_to_array('alpha,beta,gamma,delta', ','))
   WITH ORDINALITY AS elems(e, i);
┌───────┬───┐
│   e   │ i │
├───────┼───┤
│ alpha │ 1 │
│ beta  │ 2 │
│ gamma │ 3 │
│ delta │ 4 │
└───────┴───┘
(4 rows)

虽然还不清楚你下一步想做什么,但这可能是我处理这个问题的方法。

xoshrz7s

xoshrz7s2#

谢谢,我终于可以添加到数组中了。我想我错过了第二组花括号,以及在执行追加时的造型。
然而,关于ORDINALITY的评论引起了我的兴趣,因为使用内置功能似乎比构建自己的功能更可取。但是在使用了一段时间之后,我意识到在我的特定情况下,它可能会使一些相当混乱的代码实现。我正在研究从UniData数据库传输数据的过程,如导出字段和子字段分隔符。对于那些不熟悉UniData的人来说,它有多值字段(本质上是数组)的概念,但也可以有多值数据。因此,你有一组(或几组)数组字段,它们的唯一联系是它们在数组中的位置。因此,为了实现unnest/ordinality逻辑,似乎我需要为每个字段创建子查询,在每个子查询中横向连接到主表,然后通过主ID和每个子查询中每个unnest返回的序号位置连接每个子查询中的数据。
当您可能有十几个字段都需要被转换为子查询,并且在可能的数百万条记录中执行此操作时,编码似乎会变得非常不规则,并且性能待定。我可能必须进行一些负载测试,以查看代码的混乱是否弥补了任何潜在的性能增益。

相关问题