PostgreSQL:为什么子查询不能作为表达式返回多行,但函数可以吗?

如果我尝试创建一个值为select的返回多行的列,则会出现错误.
=> select (select 1 union select 2);
ERROR:  more than one row returned by a subquery used as an expression

但是如果我创建一个执行相同操作的函数,我会得到我想要的行为.

=> create or replace function onetwo() returns setof integer as $$
$> select 1 union select 2 
$> $$language 'sql' strict immutable;
CREATE FUNCTION
=> select onetwo();
 onetwo 
--------
      1
      2

为什么不同?

虽然OMG Ponies的回答是完全正确的,但我宁愿这样说:你把SELECT f()与SELECT文字混淆了.

> SELECT f()执行一个函数并返回其结果.并且,表返回函数也可以写为SELECT * FROM f() – 这更加优雅.因为Pg还没有存储过程 – 可以通过函数完成更少的调度 – 我们使用SELECT,因为Microsoft sql使用EXECUTE> SELECT LITERAL是一种返回文字方法(可以放在行/列中的东西).

相关文章

来源:http://www.postgres.cn/docs/11/ 4.1.1. 标识符和关键词 SQL标识符和关键词必须以一个...
来源:http://www.postgres.cn/docs/11/ 8.1. 数字类型 数字类型由2、4或8字节的整数以及4或8...
来源:http://www.postgres.cn/docs/11/ 5.1. 表基础 SQL并不保证表中行的顺序。当一个表被读...
来源:http://www.postgres.cn/docs/11/ 6.4. 从修改的行中返回数据 有时在修改行的操作过程中...
来源:http://www.postgres.cn/docs/11/ 13.2.1. 读已提交隔离级别 读已提交是PostgreSQL中的...
来源:http://www.postgres.cn/docs/11/ 9.7. 模式匹配 PostgreSQL提供了三种独立的实现模式匹...