gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 12:44:57 24 4
gpt4 key购买 nike

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

SELECT generate_series(1,10);

但是我不能这样做:

SELECT (SELECT generate_series(1,10));

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

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

最佳答案

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

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

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

简单的形式可以替换为:

SELECT g
FROM generate_series(1,10) g;

尽可能将 SRF 移动到 FROM 子句并将它们视为表 - 从 9.3 版本开始几乎总是可能的。

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

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;

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

关于sql - 如何将实体转换为在 PostgreSQL 中设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29266039/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com