如何调用入参为表类型的PostgreSQL函数并返回拆分的多列结果
解决方案
你只需要将返回表类型的函数放到FROM子句中,配合LATERAL关联引用外层查询的行参数,再查询函数返回的所有列即可:
SELECT f.* FROM "table" AS t CROSS JOIN LATERAL func(t) AS f WHERE t.id = 1;
LATERAL关键字允许你在子查询/函数中引用前面FROM列表中表的列,这里正好用来把外层的t行参数传入func。
替代写法
你也可以直接对返回的复合行值使用.*语法拆列,写法更简洁:
SELECT (func(t)).* FROM "table" AS t WHERE id = 1;
注意:该写法存在性能隐患:如果你的函数标记为
VOLATILE(PostgreSQL函数默认的 volatility 属性),数据库会为每行的每一列都单独执行一次函数,数据量较大时性能会大幅下降,因此更推荐使用第一种LATERAL的写法。
原查询问题原因
你之前的写法SELECT func(t)是直接把函数返回的整行复合类型作为单个值返回,所以只会展示为一列带括号的拼接格式,只要对复合值做拆列处理或者把函数作为表源查询即可得到独立的多列结果。
内容的提问来源于stack exchange,提问作者Pawel095
相关产品推荐
相关产品推荐

