使用给定值生成2d数组

时间:2017-01-10 19:30:02

标签: postgresql postgresql-9.4

我试图打开1d jsonb数组

[1, 2]

进入2d数组,其元素重复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

还有其他方法吗?

1 个答案:

答案 0 :(得分:4)

首先,您需要将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}}