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
相关产品推荐
相关产品推荐

