最初のスライスを取得するには 配列の:
SELECT my_arr[1:1];
結果の配列は、同じ配列次元を持ちます 入力として。
以前の回答の詳細はこちら:
- 配列を1レベルずつネスト解除します
平らにする 結果:
SELECT ARRAY(SELECT unnest(my_arr[1:1]));
またはクリーナー:
SELECT ARRAY(SELECT * FROM unnest(my_arr)[1:1]));
例
SELECT (ARRAY[[1,2,3], [4,5,6], [7,8,9]])[1:1];
結果:
{{1,2,3}} -- 2D array
または:
SELECT ARRAY(
SELECT unnest((ARRAY[[1,2,3], [4,5,6], [7,8,9]])[1:1])
);
結果:
{1,2,3} -- 1D array
unnest()
をエミュレートします Postgres8.3で
コメントへの回答:
リンクしているWikiページは少し誤解を招くものでした。 2次元配列のコードで更新しました。
unnest()
1次元配列の場合:
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()
2次元配列の場合:
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;
集計関数array_agg()
Postgres 8.3ではデフォルトでインストールされていません:
CREATE AGGREGATE array_agg(anyelement) (
SFUNC = array_append,
STYPE = anyarray,
INITCOND = '{}'
);
2次元配列を1次元配列にネスト解除します:
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フィドル。