在PostgreSQL中,什么是g(i):从生成下标($1,1)g(i)?

在PostgreSQL中,什么是g(i):从生成下标($1,1)g(i)?,sql,postgresql,Sql,Postgresql,这在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)) I接收:«I»列中不存在错误 什么是g(i) g(i)定义

这在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))

I接收:«I»列中不存在错误

什么是g(i)

g(i)
定义由
generate_series()
函数返回的表(resultset)的结构

它将别名
g
分配给名为
i

的结果集。generate_subscripts是一个“set returning function”,调用它时将返回多行。这就是为什么它经常被放在FROM子句中

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

从生成下标($1,1)g(i)

指:

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

或以SQL形式:

创建表g(i整数)

插入到g SELECT*中,从生成_下标(一些_数组,1)

按i从g订单中选择i

如果没有这个别名,查询的SELECT部分就不知道如何引用generate_下标生成的结果

g(i)和gs(i)的使用是研究生界的惯例。“g”或“gs”代表“生成_系列”或“生成_下标”。“i”是“迭代器”的传统编程变量。实际上,您可以使用任何您想要的别名,我鼓励您使用实际引用您尝试执行的操作的别名,以便改进未来的代码维护。例如:

FROM生成下标($1,1)作为功能(功能编号)


,还可以参考(向下滚动到35.4.8.SQL函数返回集合)。一旦你自己写了一个,你就更清楚为什么你需要一个别名来引用它的结果。

谢谢。我指的是:它是什么类型的表达式?:对已知函数的调用:生成下标($1,1),然后调用未知函数g(I)。我从中阅读了所有关于子句的内容,但从未发现它可以有两个并排的函数。@fvel:它既不是“表达式”,也不是函数调用。它是定义返回表结构的别名。谢谢Josh,现在已经很清楚了。回答得很好。谢谢你,一匹没有名字的马,你说得对。
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);