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

时间:2010-09-16 15:53:26

标签: sql postgresql function subquery

如果我尝试创建一个值为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

为什么会有差异?

2 个答案:

答案 0 :(得分:5)

这不是苹果与苹果的比较。

select * 
  FROM (select 1 
        union ALL 
        select 2)

...相当于你的功能。

SELECT子句中的列只能为每条记录返回一个值。你的UNION例子是不可能的。所以我将它转换为派生表/内联视图,这是函数示例所发生的事情。

答案 1 :(得分:4)

虽然OMG小马的回答是完全正确的,但我宁愿这样说:你让SELECT f()SELECT literal混淆。

  • SELECT f() 执行函数并返回其结果。并且,表返回函数也可以写为SELECT * FROM f() - 这更加优雅。因为Pg还没有存储过程 - 可以通过函数完成更少的调度 - 我们使用SELECT,因为Microsoft SQL使用EXECUTE

  • SELECT LITERAL是一种返回文字的方法(可以放在行/列中的东西)。