如何将实体转换为在 PostgreSQL 中设置

How to cast entity to set in PostgreSQL

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

SELECT generate_series(1,10);

但是我做不到:

SELECT (SELECT generate_series(1,10));

我能否以某种方式将 SELECT 结果转换为 setof int 以与 generate_series() 的结果一样使用它?

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

您的第一个表单是 Postgres 的非标准功能。它允许 SELECT 列表中的 SRF(设置返回函数),它被扩展到多行:

  • Is there something like a zip() function in PostgreSQL that combines two arrays?

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

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

简单形式可以替换为:

SELECT g
FROM   generate_series(1,10) g;

尽可能将 SRF 移至 FROM 子句并将它们视为 tables - 自版本 9.3 以来几乎总是可行的。

请注意,g 在示例中自动用作 table 列别名。 g in SELECT g 首先绑定到列名。更明确的语法:

SELECT g
FROM   generate_series(1,10) AS t(g);  -- table_alias(column_alias)

您需要了解行集(~table)和数组。这会给你一个 array 的整数:

SELECT ARRAY(SELECT g FROM generate_series(1,10) g) AS g_arr;

浏览标签 and 以获得带有代码示例的许多相关答案。