You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL:如何仅调用一次返回record类型的函数获取多值

PostgreSQL:仅调用一次返回record的函数获取多列值

我正在编写SQL程序,通过返回record类型的函数计算列来创建表。函数定义如下:

create or replace function get_items(col1 int, col2 int) returns record

最初尝试的建表语句:

create table table_items as (
with q as (
    select *,
   (SELECT * FROM get_items(t.col1, t.col2) AS (item1 integer, item2 integer))
    from 
    table_t as t
    )
    select * from q
);

执行时出现错误:

ERROR:  subquery must return only one column

修改后的代码可以运行,但函数被调用了两次,导致获取item2时速度慢了一倍:

create table table_items as (
with q as (
    select *,
   (SELECT item1 FROM get_items(t.col1, t.col2) AS (item1 integer, item2 integer)),
   (SELECT item2 FROM get_items(t.col1, t.col2) AS (item1 integer, item2 integer)) 
    from 
    table_t as t
    )
    select * from q
);

请问是否有办法仅调用一次该函数就能获取两个返回值?


解决方案

可以通过LATERAL JOIN(PostgreSQL原生支持)实现仅调用一次函数并展开所有返回列,彻底避免重复调用带来的性能损耗:

create table table_items as
select 
    t.*,
    res.item1,
    res.item2
from table_t as t
left join lateral get_items(t.col1, t.col2) as res(item1 integer, item2 integer) on true;

也可以用更简洁的隐式LATERAL写法,效果完全一致:

create table table_items as
select 
    t.*,
    res.item1,
    res.item2
from table_t as t,
     get_items(t.col1, t.col2) as res(item1 integer, item2 integer);

这两种写法都会对table_t中的每一行仅调用一次get_items函数,同时解析出item1和item2两个返回字段,既解决了原语句的语法错误,又保证了执行效率。


内容的提问来源于stack exchange,提问作者Marina

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 21:50:20