説明
SELECT (ARRAY[[1,2,3], [4,5,6], [7,8,9]])[0]
と同じ値を返します
SELECT (ARRAY[[1,2,3], [4,5,6], [7,8,9]])[17]
これはNULLです。その件に関するドキュメントを引用します:
デフォルトでは、配列の次元の下限インデックス値は1に設定されています。
0
ここでは特別な意味はありません。また、2次元配列では、2つのインデックスが必要です。 基本要素を取得します。このように:
SELECT (ARRAY[[1,2,3], [4,5,6], [7,8,9]])[1][2]
結果:
2
メッセージの最初の部分は少し不明瞭です。
SELECT array_dims(ARRAY[[1,2,3], [4,5,6], [7,8,9]])
結果:
[1:3][1:3]
それは2つです それぞれ3つの要素(1から3)(9つの基本要素)を持つディメンション。
n-1
が必要な場合 寸法の場合、これは正しい結果です:
SELECT ARRAY (SELECT unnest('{{1,2,3}, {4,5,6}, {7,8,9}}'::int[]))
結果:
{1,2,3,4,5,6,7,8,9}
それは1つです 寸法。 unnest()
行ごとに常に1つの基本要素を生成します。あなたが正確にどのような結果を望んでいるかはわかりません。あなたの例は、中括弧のセットが欠落している別の2次元配列です...?
{1,2,3}, {4,5,6}, {7,8,9}
アレイのスライスが必要な場合 、次の表記を試してください:
SELECT (ARRAY[[1,2,3], [4,5,6], [7,8,9]])[1:2]
結果:
{{1,2,3},{4,5,6}}
またはこれ:
SELECT (ARRAY[[1,2,3], [4,5,6], [7,8,9]])[2:2][1:2]
結果:
{{4,5}}
平らにする 結果(1D配列を取得):
- 2Dアレイpostgresqlから1Dアレイを選択する方法
詳細については、こちらのマニュアルをご覧ください。
機能
後のテストで、このplpgsql関数が多くであることが明らかになりました。 もっと早く。 Postgres 9.1以降が必要です:
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;
参照:
- PostgreSQLで2D配列を1D配列にすばやくアンネストするにはどうすればよいですか?
これは、Lukasが投稿した関数の改良および簡略化されたバージョンです:
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;
Postgresバージョン<8.4の場合、array_agg()
デフォルトではインストールされません。最初に作成します:
CREATE AGGREGATE array_agg(anyelement) (
SFUNC=array_append,
STYPE=anyarray,
INITCOND='{}'
);
また、generate_subscripts()
まだ生まれていません。代わりに使用してください:
...
FROM generate_series(array_lower($1,1), array_upper($1,1)) d1
, generate_series(array_lower($1,2), array_upper($1,2)) d2
...
電話:
SELECT unnest_2d_1d(ARRAY[[1,2], [3,4], [5,6]]);
結果
{1,2}
{3,4}
{5,6}
SQLフィドル。