さて、コメントで明らかにされた本当の質問に答えるために、それは次のように見えます:
2 つの配列 'a' と 'b' が与えられた場合、それらの要素をペアにして、要素のペアをクエリで列のエイリアスとして取得するにはどうすればよいですか?
これに対処するには、いくつかの方法があります。
配列の長さが等しい場合にのみunnest
、節で複数の関数を使用しますSELECT
(下位互換性のためにのみ使用するべき非推奨の方法です)。
generate_subscripts
配列をループするために使用します。
古いバージョンをサポートする必要がある場合は、 generate_series
over サブクエリを使用array_lower
しarray_upper
てエミュレートします。generate_subscripts
generate_subscripts
タプルを返す順序に依存し、unnest
期待しています-私の他の答えのように、以下に示すように。動作しますが、将来のバージョンで動作することは保証されていません。
PostgreSQL 9.4 で追加された機能 (WITH ORDINALITY
最初の投稿も参照) を使用して、9.4 がリリースされたときの行番号を取得unnest
します。
UNNEST
SQL 標準ですが、PostgreSQL ではまだサポートされていないmultiple-array を使用します。
したがって、arraypair
配列パラメーターa
とを持つ関数があるとしb
ます。
CREATE OR REPLACE FUNCTION arraypair (a integer[], b text[])
RETURNS TABLE (col_a integer, col_b text) AS $$
-- blah code here blah
$$ LANGUAGE whatever IMMUTABLE;
そしてそれは次のように呼び出されます:
SELECT * FROM arraypair( ARRAY[1,2,3,4,5,6,7], ARRAY['a','b','c','d','e','f','g'] );
可能な関数定義は次のとおりです。
SRF-in- SELECT
(非推奨)
CREATE OR REPLACE FUNCTION arraypair (a integer[], b text[])
RETURNS TABLE (col_a integer, col_b text) AS $$
SELECT unnest(a), unnest(b);
$$ LANGUAGE sql IMMUTABLE;
配列の長さが等しくない場合、奇妙で予期しない結果が生成されます。SELECT
その理由と正確に何が起こるかについては、セットを返す関数とリスト内の非標準的な使用に関するドキュメントを参照してください。
generate_subscripts
これはおそらく最も安全なオプションです。
CREATE OR REPLACE FUNCTION arraypair (a integer[], b text[])
RETURNS TABLE (col_a integer, col_b text) AS $$
SELECT
a[i], b[i]
FROM generate_subscripts(CASE WHEN array_length(a,1) >= array_length(b,1) THEN a::text[] ELSE b::text[] END, 1) i;
$$ LANGUAGE sql IMMUTABLE;
配列の長さが等しくない場合、書かれているように、短い方には null 要素が返されるため、完全な外部結合のように機能します。ケースの意味を逆にすると、内部結合のような効果が得られます。この関数は、配列が 1 次元であり、インデックス 1 から始まると想定します。配列引数全体が NULL の場合、関数は NULL を返します。
より一般化されたバージョンは PL/PgSQL で記述され、 check array_ndims(a) = 1
、 check array_lower(a, 1) = 1
、null 配列のテストなどを行います。それはあなたに任せます。
ペアごとのリターンを期待:
これは動作することが保証されていませんが、PostgreSQL の現在のクエリ エグゼキュータでは動作します。
CREATE OR REPLACE FUNCTION arraypair (a integer[], b text[])
RETURNS TABLE (col_a integer, col_b text) AS $$
WITH
rn_c1(rn, col) AS (
SELECT row_number() OVER (), c1.col
FROM unnest(a) c1(col)
),
rn_c2(rn, col) AS (
SELECT row_number() OVER (), c2.col
FROM unnest(b) c2(col)
)
SELECT
rn_c1.col AS c1,
rn_c2.col AS c2
FROM rn_c1
INNER JOIN rn_c2 ON (rn_c1.rn = rn_c2.rn);
$$ LANGUAGE sql IMMUTABLE;
generate_subscripts
もっと安全に使用することを検討します。
複数引数unnest
:
これは機能するはずですが、PostgreSQLunnest
は (まだ) 複数の入力配列を受け入れないため機能しません。
SELECT * FROM unnest(a,b);