如何从2d数组postgresql中选择1d数组

the*_*yew 5 arrays postgresql

我有2d数组,并且只想选择它的第一个元素,即1d数组.我怎么做?

Erw*_*ter 10

获取数组的第一个切片

SELECT my_arr[1:1];
Run Code Online (Sandbox Code Playgroud)

生成的数组与输入具有相同的数组维度.
我之前的答案详情如下:

为了平坦化结果:

SELECT ARRAY(SELECT unnest(my_arr[1:1]));
Run Code Online (Sandbox Code Playgroud)

或清洁:

SELECT ARRAY(SELECT * FROM unnest(my_arr)[1:1]));
Run Code Online (Sandbox Code Playgroud)

例子

SELECT (ARRAY[[1,2,3], [4,5,6], [7,8,9]])[1:1];
Run Code Online (Sandbox Code Playgroud)

结果

{{1,2,3}}  -- 2D array
Run Code Online (Sandbox Code Playgroud)

要么

SELECT ARRAY(
   SELECT unnest((ARRAY[[1,2,3], [4,5,6], [7,8,9]])[1:1])
   );
Run Code Online (Sandbox Code Playgroud)

结果

{1,2,3}  -- 1D array
Run Code Online (Sandbox Code Playgroud)

在Postgres 8.3中模拟unfst()

回复您的评论:您链接
Wiki页面有点误导.我更新了它并添加了二维数组的代码:

unnest() 对于一维数组:

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

unnest() 对于二维数组:

CREATE OR REPLACE FUNCTION unnest_2d(anyarray)
  RETURNS SETOF anyelement 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$  LANGUAGE sql IMMUTABLE;
Run Code Online (Sandbox Code Playgroud)

unnest()默认情况下未在第8.3页中安装聚合函数:

CREATE AGGREGATE array_agg(anyelement) (
 SFUNC = array_append,
 STYPE = anyarray,
 INITCOND = '{}'
);
Run Code Online (Sandbox Code Playgroud)

Unnest 2d数组到1d数组:

CREATE OR REPLACE FUNCTION unnest_2d_1d(anyarray)
  RETURNS SETOF anyarray 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$  LANGUAGE sql IMMUTABLE;
Run Code Online (Sandbox Code Playgroud)

SQL小提琴.