PostgreSQL函数返回结果格式差异原因及列拆分方法咨询
PostgreSQL函数输出格式问题:原因与解决办法
为什么函数输出和普通查询不一样?
你遇到的这个情况其实是PostgreSQL处理返回表类型函数的默认行为导致的。
当你执行普通的select 1.1 as x, 1.1 as y;时,这条语句明确返回两个独立的标量列,PostgreSQL会直接把它们拆分成两列展示。但你的foo4函数定义为返回TABLE(x float, y float),它本质上返回的是一组复合行对象。当你用select foo4(4);直接调用时,PostgreSQL会把每个返回的行当成一个单一的复合值来输出,所以就出现了(1.1,1.1)这种包裹式的格式,而不是拆分的两列。
怎么让函数输出拆成两列?
有两种简单的方法可以实现你想要的效果:
方法1:把函数当成表来查询(推荐)
直接用SELECT * FROM调用函数,PostgreSQL会自动识别函数返回的表结构,并展开成对应的列:
SELECT * FROM foo4(4);
执行后就能得到和普通查询一致的输出:
x | y -----+----- 1.1 | 1.1 (1 row)
方法2:显式展开复合行
如果你习惯用select直接调用的写法,也可以通过语法显式展开行里的列:
SELECT (foo4(4)).*;
不过这种写法可读性不如第一种,日常使用更推荐第一种方式。
另外提一句:你的函数已经明确指定了返回表的列定义(TABLE(x float, y float)),所以不需要额外处理列类型映射,直接用第一种方法就完美解决问题啦。
内容的提问来源于stack exchange,提问作者LarsA
相关产品推荐
相关产品推荐

