如果我尝试创建一个值为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
为什么会有差异?
答案 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
是一种返回文字的方法(可以放在行/列中的东西)。