To explain
SELECT (ARRAY[[1,2,3], [4,5,6], [7,8,9]])[0]
returns the same as
SELECT (ARRAY[[1,2,3], [4,5,6], [7,8,9]])[17]
which is null. I cite documents in this regard :
By default, the index value of the lower boundary of the dimension array is set to one.
0 does not really matter here. Also, with two-dimensional arrays, you need two indexes to get the base element. Like this:
SELECT (ARRAY[[1,2,3], [4,5,6], [7,8,9]])[1][2]
Result:
2
The first part of your message is a bit fuzzy.
SELECT array_dims(ARRAY[[1,2,3], [4,5,6], [7,8,9]])
Result:
[1:3][1:3]
These are two dimensions with 3 elements (from 1 to 3) each (9 basic elements).
If you want the dimensions n-1 , then this is the correct result:
SELECT ARRAY (SELECT unnest('{{1,2,3}, {4,5,6}, {7,8,9}}'::int[]))
Result:
{1,2,3,4,5,6,7,8,9}
This is one dimension. unnest() always creates one base element for each line. Iโm not sure which result you want for sure. Your example is another 2-dimensional array with a missing set of curly braces ...?
{1,2,3}, {4,5,6}, {7,8,9}
If you want to slice an array , try this notation:
SELECT (ARRAY[[1,2,3], [4,5,6], [7,8,9]])[1:2]
Result:
{{1,2,3},{4,5,6}}
Or that:
SELECT (ARRAY[[1,2,3], [4,5,6], [7,8,9]])[2:2][1:2]
Result:
{{4,5}}
In smooth out the result (get a 1D array):
- How to select 1d array from 2d postgresql array
More details in the manual here .
Functions
A test later showed that this plpgsql function is much faster. Requires Postgres 9.1 or later:
CREATE OR REPLACE FUNCTION unnest_2d_1d(ANYARRAY, OUT a ANYARRAY) RETURNS SETOF ANYARRAY AS $func$ BEGIN FOREACH a SLICE 1 IN ARRAY $1 LOOP RETURN NEXT; END LOOP; END $func$ LANGUAGE plpgsql IMMUTABLE;
Cm:
- How to quickly disable a 2d array in a 1d array in PostgreSQL?
This is an improved and simplified version of the Lukas feature, hosted :
CREATE OR REPLACE FUNCTION unnest_2d_1d(anyarray) RETURNS SETOF anyarray AS $func$ SELECT array_agg($1[d1][d2]) FROM generate_subscripts($1,1) d1 , generate_subscripts($1,2) d2 GROUP BY d1 ORDER BY d1 $func$ LANGUAGE sql IMMUTABLE;
For versions of Postgres <8.4, array_agg() not set by default. First create it:
CREATE AGGREGATE array_agg(anyelement) ( SFUNC=array_append, STYPE=anyarray, INITCOND='{}' );
In addition, generate_subscripts() has not yet been born. Use instead
... FROM generate_series(array_lower($1,1), array_upper($1,1)) d1 , generate_series(array_lower($1,2), array_upper($1,2)) d2 ...
Call:
SELECT unnest_2d_1d(ARRAY[[1,2], [3,4], [5,6]]);
Result
{1,2} {3,4} {5,6}
SQL Fiddle