从问题的回答来看如何对 varchar[] 使用 array_agg(),
我们可以创建一个自定义聚合函数来聚合 Postgres 中的 n 维数组,如下所示:
CREATE AGGREGATE array_agg_mult (anyarray) (
SFUNC = array_cat
,STYPE = anyarray
,INITCOND = '{}'
);
一个限制是这些值必须共享相同的数组范围和相同的长度,处理空值和不同长度不起作用。
从答案来看:
没有办法解决这个问题,数组类型不允许这样的
Postgres 中不匹配。您可以用 NULL 值填充数组,这样
所有维度都有匹配的范围。
我有这样的行
------ arrayfield
----- {1},
----- {},
----- {abc}
array_agg_mult(ARRAY[arrayfield]) AS customarray
我期待像这样的汇总结果{{1},NULL,{abc}}
但它会抛出
ERROR: cannot concatenate incompatible arrays
DETAIL: Arrays with differing element dimensions are not compatible for concatenation.
有什么方法可以在自定义函数中添加填充值吗?
我发现问题是当数组length是不同的。{a},{null},{1}
会聚合,但是{a,b},{},{1}
将不会。
所以我需要一个查询,可以将 NULL 元素添加到现有数组中。
一种解决方案是始终附加两个 NULL(2 是该字段中的最大长度)array_cat(arr, ARRAY[NULL,NULL])
并将数组修剪为长度 2:
{1} --> {1,NULL,NULL} --> {1,NULL}
{NULL} --> {NULL,NULL,NULL} --> {NULL,NULL}
{abc, def} --> {abc,def,NULL,NULL} --> {abc, def}
但我无法弄清楚syntax.