]> git.8kb.co.uk Git - postgresql/pg_2d_arrays/blob - pg_two_dimensional_unnest.plpgsql
Initial commit
[postgresql/pg_2d_arrays] / pg_two_dimensional_unnest.plpgsql
1 -- 
2 -- Glyn Astill 21/04/2012
3 -- Functions to assist unnesting multidimensional arrays in PostgreSQL 9.0 and earlier
4 --
5
6 -- Some similar functions for Pg 9.1+ only can be found here
7 -- https://wiki.postgresql.org/wiki/Unnest_multidimensional_array
8 -- https://wiki.postgresql.org/wiki/Multidimensional_Array_Mapping
9
10
11 -- Given a 2 dimensional array will unnest the element at the supplied
12 -- index in the second dimension.
13 -- Pg 8.0+
14 CREATE OR REPLACE FUNCTION public.unnest_element(anyarray, integer)
15 RETURNS SETOF anyelement
16 AS $BODY$
17 BEGIN
18         RETURN QUERY SELECT $1[i][$2]
19         FROM generate_series(array_lower($1,1), array_upper($1,1)) i;
20 END;
21 $BODY$
22 LANGUAGE plpgsql IMMUTABLE;
23
24 --
25
26 -- Given a 2 dimensional array will unnest the first dimension
27 -- returning the a set of one dimensional array.
28 -- Pg 8.4+
29 CREATE OR REPLACE FUNCTION public.unnest_first(anyarray)
30 RETURNS SETOF anyarray
31 AS $BODY$
32 BEGIN
33         RETURN QUERY 
34         SELECT (SELECT array_agg($1[i][i2])
35                 FROM generate_series(array_lower($1,2), array_upper($1,2)) i2)
36         FROM generate_series(array_lower($1,1), array_upper($1,1)) i;
37 END;
38 $BODY$
39 LANGUAGE plpgsql IMMUTABLE;
40
41
42 -- E.g.
43 -- 
44 -- TEST=# select unnest_element(ARRAY[ARRAY[1,2,3],ARRAY[4,5,6]],3);
45 --  unnest_element
46 -- ----------------
47 --               3
48 --               6
49 -- (2 rows)
50 -- 
51 -- TEST=# select unnest_first(ARRAY[ARRAY[1,2,3],ARRAY[4,5,6]]);
52 --  unnest_dimension
53 -- ------------------
54 --  {1,2,3}
55 --  {4,5,6}
56 -- (2 rows)