6

これはpostgresのマニュアルにあります:

CREATE or replace FUNCTION mleast(a VARIADIC numeric[]) 
   RETURNS numeric 
AS $$
   SELECT min($1[i]) FROM generate_subscripts($1, 1) g(i);
$$ LANGUAGE SQL;

SELECT mleast(10, -1, 5, 4.4);

私が書いた場合:(g(i)を省略)

CREATE or replace FUNCTION mleast(a VARIADIC numeric[]) 
   RETURNS numeric 
AS $$
  SELECT min($1[i]) FROM generate_subscripts($1, 1);
$$ LANGUAGE SQL;


SELECT mleast(10, -1, 5, 4.4);

受信:エラーは列«i»に存在しません

g(i)とは正確には何ですか?

4

2 に答える 2

18

generate_subscripts は「セットを返す関数」であり、呼び出すと複数の行が返されます。そのため、最も頻繁に FROM 句に入れられます。

デフォルトでは、Postgres に組み込まれている generate_subscripts からの結果は匿名であり、残りのクエリで参照するためにハンドルとして使用する名前が自動的に付けられます。これが g(i) です。これは、generate_subscripts によって返されるテーブル (g) と列 (i) のエイリアスです。したがって、この表現:

FROM generate_subscripts($1, 1) g(i)

意味:

関数 generate_subscripts を実行し、その結果を「i」という単一の列を持つ「g」というテーブルに割り当てます

またはSQL形式で:

CREATE TABLE g ( i integer );

INSERT INTO g SELECT * FROM generate_subscripts(some_array, 1);

SELECT i FROM g ORDER BY i;

そのエイリアスがないと、クエリの SELECT 部分は、generate_subscripts によって生成された結果を参照する方法がわかりません。

g(i) と gs(i) の使用は、Postgres の世界の慣例です。「g」または「gs」は「generate_series」または「generate_subscripts」を表します。「i」は「反復子」の従来のプログラミング変数です。実際には任意のエイリアスを使用できます。将来のコード メンテナンスを改善するために、実行しようとしているものを実際に参照するエイリアスを使用することをお勧めします。例えば:

FROM generate_subscripts( $1, 1 ) as features(feature_no)

これらの関数の詳細は PostgreSQL ドキュメントに記載されています。また、セットを返す関数の記述方法についてドキュメントを参照することも役立ちます(35.4.8. セットを返す SQL 関数までスクロールします)。自分で作成すると、その結果を参照するためにエイリアスが必要な理由が明確になります。

于 2012-05-20T21:46:23.293 に答える
3

g(i)関数によって返されるテーブル (結果セット) の構造を定義しgenerate_series()ます。

gという名前の単一の列を持つ結果セットにエイリアスを割り当てますi

于 2012-05-20T15:34:16.410 に答える