How to select 1d array from 2d array?

前端 未结 1 513
盖世英雄少女心
盖世英雄少女心 2020-12-17 00:05

I have 2d array and want to select only first element of it, which is 1d array.
How do I do that?

相关标签:
1条回答
  • 2020-12-17 00:20

    To get the first slice of an array:

    SELECT my_arr[1:1];
    

    The resulting array has the same array dimensions as the input.
    Details in my previous answer here:

    • Unnest array by one level

    To flatten the result:

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

    Or cleaner:

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

    Examples

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

    Result:

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

    Or:

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

    Result:

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

    Emulate unnest() in Postgres 8.3

    Response to your comment:
    The Wiki page you are linking to was a bit misleading. I updated it with code for 2-dimensional arrays.

    unnest() for 1-dimensional array:

    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;
    

    unnest() for 2-dimensional array:

    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;
    

    The aggregate function array_agg() is not installed by default in Postgres 8.3:

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

    Unnest 2d array to 1d arrays:

    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;
    

    SQL Fiddle.

    0 讨论(0)
提交回复
热议问题