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

postgreSQLで配列内部インデックスにアクセスする方法は?

    PostgreSQLはします 配列の添え字を生成するための専用関数を提供します:

    WITH   x(a) AS ( VALUES ('{1,20,3,5}'::int[]) )
    SELECT generate_subscripts(a, 1) AS idx
          ,unnest(a) AS val
    FROM   x;

    事実上、サブクエリがないだけで、@ Frankのクエリとほぼ同じように機能します。
    さらに、1で始まらない添え字でも機能します。 。

    どちらのソリューションも1次元で機能します 配列のみ! (複数の次元に簡単に拡張できます。)

    機能:

    CREATE OR REPLACE FUNCTION unnest_with_idx(anyarray) 
    RETURNS TABLE(idx integer, val anyelement) LANGUAGE SQL IMMUTABLE AS
    $func$
      SELECT generate_subscripts($1, 1), unnest($1);
    $func$;
    

    電話:

    SELECT * FROM unnest_with_idx('{1,20,3,5}'::int[]);
    

    また、考慮してください:

    SELECT * FROM unnest_with_idx('[4:7]={1,20,3,5}'::int[]);
    

    この関連する質問の配列添え字についての詳細。

    もし 実際に正規化された添え字(1から始まる)が必要な場合は、次を使用します:

    SELECT generate_series(1, array_length($1,1)) ...

    これは、array_length()を使用しただけで、すでに行ったクエリとほぼ同じです。 array_upper()の代わりに -非標準の添え字では失敗します。

    パフォーマンス

    これまでにここに示したすべてのクエリを使用して、1000intの配列で簡単なテストを実行しました。 row_number()を除いて、すべて同じパフォーマンス(〜3.5 ms)です。 サブクエリで(〜7.5ミリ秒)-サブクエリのため、予想どおり。

    更新:Postgres 9.4+

    非標準のインデックス添え字を使用する場合を除き、新しい WITH ORDINALITYを使用してください 代わりに:

    • 要素番号付きのPostgreSQLunnest()


    1. ベンチマークアーカイブを使用したPostgreSQLテストツールの更新

    2. 信号処理データモデルを使用して信号を追跡する

    3. ページングを実装する効率的な方法

    4. データベースのMySQLデータベースサイズを取得するにはどうすればよいですか?