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

2Dアレイから1Dアレイを選択するにはどうすればよいですか?

    最初のスライスを取得するには 配列の:

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




    1. SELECT FROMステートメントでテーブルタイプを使用するにはどうすればよいですか?

    2. OracleとSQLServerのスペースの処理の違い

    3. OracleIF条件の例

    4. SQLで数値を最も近い整数に切り上げる方法