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 是一个“set-returning 函数”,调用它时会返回多行。这就是为什么它最常放在 FROM 子句中的原因。

默认情况下,Postgres 内置的 generate_subscripts 的结果是匿名的,并且会自动使用任何名称作为句柄,以便在查询的其余部分中引用它。这就是 g(i) 的含义;它是 generate_subscripts 返回的表 (g) 和列 (i) 的别名。所以这个表达式:

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

方法:

执行函数 generate_subscripts 并将其结果分配给一个名为“g”的表,其中有一列名为“i”

或以 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 文档中有详细说明,参考文档如何编写 Set Returning Functions也很有用(向下滚动到 35.4.8. SQL Functions Returning Sets)。一旦你自己写了一个,你就会更清楚为什么需要一个别名来引用它的结果。

于 2012-05-20T21:46:23.293 回答
3

g(i)定义generate_series()函数返回的表(结果集)的结构。

它将别名分配给g具有名为的单个列的结果集i

于 2012-05-20T15:34:16.410 回答