使用的是Postgres 9.3,我发现我可以这样执行的东西:
SELECT generate_series(1,10);
但我不能这样做:
SELECT (SELECT generate_series(1,10));
我能以某种方式投SELECT结果setof int
以相同的使用它作为结果从generate_series()
究竟是什么发生的事情,为什么我可以从使用结果从功能,但不SELECT
?
使用的是Postgres 9.3,我发现我可以这样执行的东西:
SELECT generate_series(1,10);
但我不能这样做:
SELECT (SELECT generate_series(1,10));
我能以某种方式投SELECT结果setof int
以相同的使用它作为结果从generate_series()
究竟是什么发生的事情,为什么我可以从使用结果从功能,但不SELECT
?
你的第一种形式的Postgres的一个非标准的功能。 它允许SRF(组返回功能)在SELECT
列表,其扩展到多行:
注:这是工作的功能 ,而不是子选择。 这就是为什么你的第二个SELECT
是根本无效的语法。
标准SQL不有专门的规定,在所有的,因此该功能在一些干净的替代品皱起了眉头已经提供(感谢在SQL标准的改进)。 这在很大程度上是由取代LATERAL
Postgres里9.3+功能:
简单的形式可以被代替:
SELECT g
FROM generate_series(1,10) g;
只要有可能移动到SRF的FROM
子句和对待他们像表-自9.3版本几乎总是可能的。
需要注意的是g
在实施例自动用作表和列别名。 g
在SELECT g
结合至列名第一。 更明确的语法:
SELECT g
FROM generate_series(1,10) AS t(g); -- table_alias(column_alias)
你需要了解一排 ,一组行 (〜表)和阵列之间的差异。 这将使你的整数数组 :
SELECT ARRAY(SELECT g FROM generate_series(1,10) g) AS g_arr;
浏览标签产生系列和设置返回函数与代码示例许多相关的答案。