生成具有给定值的二维数组

Generate 2d array with given values

我正在尝试转换一维 jsonb 数组

[1, 2]

进入二维数组,其元素重复 3 次(结果可以在 jsonb 中)

[[1, 1, 1],
 [2, 2, 2]]

我的尝试无效

select array(select array_fill(a::text::integer, array[3])) 
  from jsonb_array_elements('[1,2]'::jsonb) as a;

ERROR:  could not find array type for data type integer[]

也许它会在以后的 PG 版本中工作,但我仅限于 PG 9.4.8

还有哪些方式?

首先,您需要将 array() 替换为 array_agg(),然后从 Postgres 9.5 开始,您就会得到您所期望的结果。

也就是说,您的问题是 array_agg() 无法聚合 9.5 之前的数组。

然后是多个 existing answers 给你,但基本上你需要创建一个新的聚合函数 array_agg_mul:

CREATE AGGREGATE array_agg_mult (anyarray)  (
    SFUNC     = array_cat,
    STYPE     = anyarray,
    INITCOND  = '{}'
);

然后 运行 以下查询应该有效:

SELECT
    array_agg_mult(array[array_fill(a::text::integer, array[3])])
FROM jsonb_array_elements('[1,2]'::jsonb) as a;

那么你应该得到:

  array_agg_mult
-------------------
 {{1,1,1},{2,2,2}}