これは私の(おそらくあなたにとっては普通の)最適化されていない解決策です:
最適化されていない内部関数を使用したPG問題の回避策:
CREATE FUNCTION unnest_with_idx(anyarray)
RETURNS TABLE(idx integer, val anyelement) AS
$$
SELECT generate_series(1,array_upper($1,1)) as idx, unnest($1) as val;
$$ LANGUAGE SQL IMMUTABLE;
テスト:
SELECT idx,val from unnest_with_idx(array[1,20,3,5]) as t;
しかし、私が言ったように、最適化されていません。PostgreSQLに配列の内部インデックスがないなんて信じられません(!!)...?しかし、この場合、問題は、このインデックスに直接アクセスする方法です。ここで、GINのような内部カウンターはどこにありますか?
注1:上記の解決策と質問は、「配列の各要素によってどのようにインデックスを作成しますか? 」と同じではありません。また、この関数は配列フィールドのテーブルインデックスではなく、分離された配列用であるため、「PostgreSQLは配列列にインデックスを付けることができますか? 」と同じではありません。
注2(回答後に編集):「配列インデックス」(より一般的な用語)または「配列添え字」または「配列カウンター」は、アキュムレーターである「内部カウンター」を次の配列に参照するためにセマンティックパスで使用できる用語です。アイテム。このカウンターへの直接アクセスを提供するPostgreSQLコマンドはないようです。関数としてgenerate_series()
、generate_subscripts()
関数はシーケンスジェネレーターであり、パフォーマンスは(最高ですが)ほぼ同じです。一方row_number()
、関数は「行の内部カウンター」への直接アクセスを提供しますが、これは配列ではなく行に関するものであり、残念ながらパフォーマンスは低下します。