sql >> データベース >  >> RDS >> PostgreSQL

配列を1レベルずつネスト解除します

    説明

    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フィドル。



    1. OracleのrownumのようにMysqlの行番号を取得する方法はありますか?

    2. Oracle 11gは、一致するすべてのオカレンスを正規表現で取得します

    3. SQLServerで外部キー制約のあるテーブルを作成する方法-SQLServer/TSQLチュートリアルパート66

    4. MySQLでselectから削除するにはどうすればよいですか?