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

複数のアレイを並列にネスト解除します

    あなたは愛する Postgresのこの新機能9.4

    unnest(anyarray, anyarray [, ...])

    unnest() 複数のアレイを並列にクリーンにアンネストするための待望の(少なくとも私は)機能を備えています 。マニュアル:

    複数の配列(おそらく異なるタイプ)を行のセットに展開します。これはFROM句でのみ許可されます;

    これは、新しいROWS FROMの特別な実装です。 機能。

    これで、関数は次のようになります。

    CREATE OR REPLACE FUNCTION multi_unnest(_some_id int
                                          , _amounts numeric[]
                                          , _invoices text[])
      RETURNS TABLE (some_id int, amount numeric, invoice text) AS
    $func$
    SELECT _some_id, u.* FROM unnest(_amounts, _invoices) u;
    $func$ LANGUAGE sql;

    電話:

    SELECT * FROM multi_unnest(123, '{100, 40.5, 76}'::numeric[] 
                            , '{01-2222-05,01-3333-04,01-4444-08}'::text[]);
    

    もちろん、単純なフォームはプレーンSQLに置き換えることができます (追加機能なし):

    SELECT 123 AS some_id, *
    FROM unnest('{100, 40.5, 76}'::numeric[]
              , '{01-2222-05,01-3333-04,01-4444-08}'::text[]) AS u(amount, invoice);
    

    以前のバージョン(Postgres 9.3- )、エレガントで安全性の低いフォームを使用できます:

    SELECT 123 AS some_id
         , unnest('{100, 40.5, 76}'::numeric[]) AS amount
         , unnest('{01-2222-05,01-3333-04,01-4444-08}'::text[]) AS invoice;
    

    古い省略形の警告:SELECTにset-returning関数があることは非標準であることに加えて リストでは、返される行数は、各配列の要素数の最小公倍数になります(数が等しくない場合は驚くべき結果が得られます)。これらの関連する回答の詳細:

    • PostgreSQLでの並列unnest()と並べ替え順序
    • 2つの配列を組み合わせたPostgreSQLのzip()関数のようなものはありますか?

    この動作は、 Postgres 10でようやくサニタイズされました。 。 SELECT内の複数のセットを返す関数 リストは「ロックステップ」で行を生成するようになりました。参照:

    • SELECT句で複数のセットを返す関数に期待される動作は何ですか?


    1. mybatisによって実行されたoracleプロシージャからパラメータを受信できません

    2. Oracleの数値列の精度の変更

    3. Androidルーム+ウィンドウ関数

    4. MySQL8.0をRHEL/CentOS8/7およびFedora35にインストールする方法