Re: unnest on multi-dimensional arrays - Mailing list pgsql-general

From Zev Benjamin
Subject Re: unnest on multi-dimensional arrays
Date
Msg-id 529CCE4B.9090201@strangersgate.com
Whole thread Raw
In response to Re: unnest on multi-dimensional arrays  (Pavel Stehule <pavel.stehule@gmail.com>)
Responses Re: unnest on multi-dimensional arrays  (Pavel Stehule <pavel.stehule@gmail.com>)
List pgsql-general
Hrm.  Conceptually, I think you actually want something like:

CREATE OR REPLACE FUNCTION public.reduce_dim(anyarray)
  RETURNS SETOF anyarray
  LANGUAGE plpgsql
AS $function$
DECLARE
   s $1%type;
   d int;
BEGIN
   d := array_ndims($1) - 1;
   FOREACH s SLICE d IN ARRAY $1 LOOP
       RETURN NEXT s;
   END LOOP;
RETURN;
END;
$function$;

Otherwise,
select * from reduce_dim(ARRAY[[1], [2], [3]])
and
select * from reduce_dim(ARRAY[[[1], [2], [3]]);

produce the same results.  Unfortunately, it looks like the SLICE
keyword only accepts a constant.


Zev

On 11/28/2013 02:28 AM, Pavel Stehule wrote:
> Hello
>
> postgres=# CREATE OR REPLACE FUNCTION public.reduce_dim(anyarray)
>   RETURNS SETOF anyarray
>   LANGUAGE plpgsql
> AS $function$
> DECLARE s $1%type;
> BEGIN
>    FOREACH s SLICE 1  IN ARRAY $1 LOOP
>        RETURN NEXT s;
>    END LOOP;
> RETURN;
> END;
> $function$;
> CREATE FUNCTION
>
> postgres=# select reduce_dim(array[array[1, 2], array[2, 3]]);
>   reduce_dim
> ------------
>   {1,2}
>   {2,3}
> (2 rows)
>
> Regards
>
> Pavel Stehule
>
> 2013/11/28 Zev Benjamin <zev-pgsql@strangersgate.com
> <mailto:zev-pgsql@strangersgate.com>>
>
>     It appears that unnest, when called on a multi-dimensional array,
>     effectively flattens the array first.  For example:
>
>     => select * from unnest(array[array[1, 2], array[2, 3]]);
>       unnest
>     --------
>            1
>            2
>            2
>            3
>     (4 rows)
>
>     while I would have expect something like the following:
>
>     => select * from unnest(array[array[1, 2], array[2, 3]]);
>       unnest
>     --------
>         {1, 2}
>         {2, 3}
>     (2 rows)
>
>     Is there any way to get the latter behavior?
>
>
>     Zev
>
>
>     --
>     Sent via pgsql-general mailing list (pgsql-general@postgresql.org
>     <mailto:pgsql-general@postgresql.org>)
>     To make changes to your subscription:
>     http://www.postgresql.org/__mailpref/pgsql-general
>     <http://www.postgresql.org/mailpref/pgsql-general>
>
>


pgsql-general by date:

Previous
From: Zev Benjamin
Date:
Subject: Re: unnest on multi-dimensional arrays
Next
From: Pavel Stehule
Date:
Subject: Re: unnest on multi-dimensional arrays