生成具有给定值的二维数组
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}}
我正在尝试转换一维 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}}