如何将实体转换为在 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;
浏览标签 generate-series and set-returning-functions 以获得带有代码示例的许多相关答案。
使用 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;
浏览标签 generate-series and set-returning-functions 以获得带有代码示例的许多相关答案。