如何在 PostgreSQL 中从 2d 数组中选择 1d 数组?

问题描述 投票:0回答:2

我有一个二维数组,只想从中选择第一个一维数组。
我该怎么做?

sql arrays database postgresql multidimensional-array
2个回答
17
投票

获取数组的第一个切片

SELECT my_arr[1:1];

生成的数组与输入具有相同的数组维度
详细信息请参阅我之前的回答:

展平结果:

SELECT ARRAY(SELECT unnest(my_arr[1:1]));

或清洁工:

SELECT ARRAY(SELECT * FROM unnest(my_arr)[1:1]));

示例

SELECT (ARRAY[[1,2,3], [4,5,6], [7,8,9]])[1:1];

结果:

{{1,2,3}}  -- 2D array

或者:

SELECT ARRAY(
   SELECT unnest((ARRAY[[1,2,3], [4,5,6], [7,8,9]])[1:1])
   );

结果:

{1,2,3}  -- 1D array

在 Postgres 8.3 中模拟
unnest()

您链接到的Wiki 页面有点误导。我用二维数组的代码更新了它。

unnest()
对于一维数组:

CREATE OR REPLACE FUNCTION unnest_1d(anyarray)
  RETURNS SETOF anyelement
  LANGUAGE sql IMMUTABLE AS
$func$
SELECT $1[i]
FROM   generate_series(array_lower($1,1), array_upper($1,1)) i
$func$;

unnest()
对于二维数组:

CREATE OR REPLACE FUNCTION unnest_2d(anyarray)
  RETURNS SETOF anyelement
  LANGUAGE sql IMMUTABLE AS
$func$
SELECT $1[d1][d2]
FROM   generate_series(array_lower($1,1), array_upper($1,1)) d1
    ,  generate_series(array_lower($1,2), array_upper($1,2)) d2
$func$;

Postgres 8.3 中默认不安装聚合函数

array_agg()

CREATE AGGREGATE array_agg(anyelement) (
 SFUNC = array_append,
 STYPE = anyarray,
 INITCOND = '{}'
);

取消二维数组到一维数组的嵌套:

CREATE OR REPLACE FUNCTION unnest_2d_1d(anyarray)
  RETURNS SETOF anyarray
  LANGUAGE sql IMMUTABLE AS
$func$
SELECT array_agg($1[d1][d2])
FROM   generate_series(array_lower($1,1), array_upper($1,1)) d1
    ,  generate_series(array_lower($1,2), array_upper($1,2)) d2
GROUP  BY d1
ORDER  BY d1
$func$;

小提琴
sqlfiddle


0
投票

您可以通过以下方式从 2D(二维)数组中获取第一个数组。 *我的帖子详细解释了如何创建和使用二维数组:

SELECT (ARRAY[['a','b','c'],['d','e','f']])[1:1]; -- {{a,b,c}}
SELECT (ARRAY[['a','b','c'],['d','e','f']])[1:1][:]; -- {{a,b,c}}
SELECT (ARRAY[['a','b','c'],['d','e','f']])[1:1][1:3]; -- {{a,b,c}}
SELECT (ARRAY[['a','b','c'],['d','e','f']])[1][:]; -- {{a,b,c}} -- This is tricky
SELECT (ARRAY[['a','b','c'],['d','e','f']])[1][1:3]; -- {{a,b,c}} -- This is tricky
SELECT (ARRAY[['a','b','c'],['d','e','f']])[1]; -- NULL
© www.soinside.com 2019 - 2024. All rights reserved.