我不知道如何将一组值追加到二维数组中。我已经尝试了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维的数组不兼容串联。"
有些帖子指出数组元素应该用花括号括起来。但这根本无法编译。
一定有个简单的解决办法。我错过了什么?
2条答案
按热度按时间kknvjkwl1#
显然,您可以向2D数组追加
但是你继续说你想要数组元素的索引(因此是2D的)。
虽然还不清楚你下一步想做什么,但这可能是我处理这个问题的方法。
xoshrz7s2#
谢谢,我终于可以添加到数组中了。我想我错过了第二组花括号,以及在执行追加时的造型。
然而,关于ORDINALITY的评论引起了我的兴趣,因为使用内置功能似乎比构建自己的功能更可取。但是在使用了一段时间之后,我意识到在我的特定情况下,它可能会使一些相当混乱的代码实现。我正在研究从UniData数据库传输数据的过程,如导出字段和子字段分隔符。对于那些不熟悉UniData的人来说,它有多值字段(本质上是数组)的概念,但也可以有多值数据。因此,你有一组(或几组)数组字段,它们的唯一联系是它们在数组中的位置。因此,为了实现unnest/ordinality逻辑,似乎我需要为每个字段创建子查询,在每个子查询中横向连接到主表,然后通过主ID和每个子查询中每个unnest返回的序号位置连接每个子查询中的数据。
当您可能有十几个字段都需要被转换为子查询,并且在可能的数百万条记录中执行此操作时,编码似乎会变得非常不规则,并且性能待定。我可能必须进行一些负载测试,以查看代码的混乱是否弥补了任何潜在的性能增益。