gpt4 book ai didi

sql - 在 PostgreSQL 中 : FROM generate_subscripts($1, 1) g(i) 中的 g(i) 是什么?

转载 作者:行者123 更新时间:2023-11-29 11:30:49 26 4
gpt4 key购买 nike

这是在 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) 到底是什么?

最佳答案

generate_subscripts 是一个“set-returning function”,调用时会返回多行。这就是为什么它最常放在 FROM 子句中的原因。

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

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

意思是:

execute the function generate_subscripts and assign its results to a table called "g" with a single column called "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”是“迭代器”的传统编程变量。您实际上可以使用任何您想要的别名,我鼓励您使用实际引用您正在尝试做的事情的别名,以改进 future 的代码维护。例如:

FROM generate_subscripts( $1, 1 ) 作为特征(feature_no)

These functions are detailed in the PostgreSQL docs , 并且引用 docs on how to write Set Returning Functions 也很有用(向下滚动到 35.4.8. SQL 函数返回集)。一旦您自己编写了一个,就会更清楚为什么您需要一个别名来引用其结果。

关于sql - 在 PostgreSQL 中 : FROM generate_subscripts($1, 1) g(i) 中的 g(i) 是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10674735/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com