【发布时间】:2016-11-12 20:51:16
【问题描述】:
在基本的 Postgres 函数教程中,有一个带有 OUT 参数的示例,如下所示:
create or replace function hi_lo(a numeric,
b numeric,
c numeric,
OUT hi numeric,
OUT lo numeric)
as $$
begin
hi := greatest(a, b, c);
lo := least(a, b, c);
end; $$
language plpgsql;
然后结果看起来像
select hi_lo(2, 3, 4);
-- returns one column, "hi_lo" with value "(4, 2)".
select * from hi_lo(2, 3, 4);
-- returns two columns, "hi" / 4 and "lo" / 2.
但是假设您想对来自执行连接的列执行函数,并且您无权修改函数或使用替代函数?例如,使用一些玩具数据:
select hi_lo(a.actor_id, length(a.name), ma.movie_id)
from
actors a
join
movies_actors ma
on
a.actor_id = ma.movie_id
limit 10;
在单个列中返回结果“hi_lo”具有 2 元组值。
将查询括在括号中并尝试从中获取select * 不会更改输出格式。所以
select *
from (
select hi_lo(a.actor_id, length(a.name), ma.movie_id)
from
actors a
join
movies_actors ma
on
a.actor_id = ma.movie_id
limit 10;
) rr
不影响结果形状。
以下尝试导致错误“子查询必须只返回一列”
select (
select * from hi_lo(a.actor_id, length(a.name), ma.movie_id)
)
from
actors a
join
movies_actors ma
on
a.actor_id = ma.movie_id
limit 10;
最后,我也尝试了unnest,但它给出了参数类型错误,因为元组值不被视为数组。
当您无法将函数评估移至from 部分时,如何在输出中实现多列?
【问题讨论】:
-
你的 Postgres 版本?
标签: sql postgresql plpgsql record