使用 Postgres 9.3,我发现我可以执行以下操作:
SELECT generate_series(1,10);
但我不能这样做:
SELECT (SELECT generate_series(1,10));
我可以以某种方式将 SELECT result 转换setof int
为与 result from 相同的使用generate_series()
吗?
究竟发生了什么,为什么我可以使用函数的结果而不是函数的结果SELECT
?
使用 Postgres 9.3,我发现我可以执行以下操作:
SELECT generate_series(1,10);
但我不能这样做:
SELECT (SELECT generate_series(1,10));
我可以以某种方式将 SELECT result 转换setof int
为与 result from 相同的使用generate_series()
吗?
究竟发生了什么,为什么我可以使用函数的结果而不是函数的结果SELECT
?
您的第一个表单是 Postgres 的非标准功能。它允许SELECT
列表中的 SRF(Set Returning Functions),扩展为多行:
注意:这适用于functions,不适用于子选择。这就是为什么你的第二个SELECT
只是无效的语法。
标准 SQL 根本没有这样的规定,因此该功能被一些人所反对,并且提供了干净的替代方案(感谢 SQL 标准的改进)。它在很大程度上被LATERAL
Postgres 9.3+ 中的功能所取代:
简单的形式可以替换为:
SELECT g
FROM generate_series(1,10) g;
尽可能将 SRF 移至FROM
子句并将它们视为表格 - 从 9.3 版开始,这几乎总是可能的。
请注意,在示例中自动g
充当表和列别名。g
inSELECT 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;
通过代码示例浏览标签generate-series和set-returning-functions以获取许多相关答案。