1

使用 Postgres 9.3,我发现我可以执行以下操作:

SELECT generate_series(1,10);

但我不能这样做:

SELECT (SELECT generate_series(1,10));

我可以以某种方式将 SELECT result 转换setof int为与 result from 相同的使用generate_series()吗?

究竟发生了什么,为什么我可以使用函数的结果而不是函数的结果SELECT

4

1 回答 1

4

您的第一个表单是 Postgres 的非标准功能。它允许SELECT列表中的 SRF(Set Returning Functions),扩展为多行:

注意:这适用于functions,不适用于子选择。这就是为什么你的第二个SELECT只是无效的语法。

标准 SQL 根本没有这样的规定,因此该功能被一些人所反对,并且提供了干净的替代方案(感谢 SQL 标准的改进)。它在很大程度上被LATERALPostgres 9.3+ 中的功能所取代:

简单的形式可以替换为:

SELECT g
FROM   generate_series(1,10) g;

尽可能将 SRF 移至FROM子句并将它们视为表格 - 从 9.3 版开始,这几乎总是可能的。

请注意,在示例中自动g充当表列别名。ginSELECT 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;

通过代码示例浏览标签以获取许多相关答案。

于 2015-03-25T20:46:09.530 回答