将 postgres 函数与查询相结合
Posted
技术标签:
【中文标题】将 postgres 函数与查询相结合【英文标题】:Combine postgres function with query 【发布时间】:2014-11-16 19:30:24 【问题描述】:我目前正在处理我的结果集中需要的 sql 函数的输出:
SELECT getAdditionalInfoAboutDate(date) from sampleCalendar
问题是,我通过以下方式得到结果:
-
“属性1、属性2、属性3”
“属性2、属性3、属性4”
...
如您所见,我得到了我想要的结果,但即使我的函数返回 3 列,它也只有一列。
当我尝试创建如下语句时:
SELECT (Select * from getAdditionalInfoAboutDate(date)) from sampleCalendar
我收到异常“子查询必须只返回一列”。
我有机会以某种方式解决这个问题吗?
编辑:找到答案HERE,即:
SELECT getAdditionalInfoAboutDate(date).* from sampleCalendar
【问题讨论】:
让函数也返回日期然后执行select * from getAdditionalInfoAboutDate(date)
怎么样?
这也会导致“子查询必须只返回一列”
什么是类型或返回值? record
?您能否提供更多有关您的功能的代码?
没关系,看看我编辑的问题 - 在另一个线程中找到答案!
【参考方案1】:
即使the answer you found 来自我,也可能会有更好的答案,具体取决于您的函数实际返回的内容:一行还是多行?假设one
行。
无论哪种方式,您的问题都是不正确。 行类型必须用括号括起来才能分解,否则语法可能不明确。必须是:
SELECT (getAdditionalInfoAboutDate(date)).* FROM sampleCalendar;
但是,Postgres 在这方面有一个弱点。它将多次评估该函数 - 结果中的每一列一次。要优化性能将函数调用放在子查询中:
SELECT (f_row).*
FROM (SELECT getAdditionalInfoAboutDate(date) AS f_row FROM sampleCalendar) sub;
或在 pg 9.3+ 中使用 LEFT JOIN LATERAL
SELECT f_row.* -- no parentheses here, it's a table alias
FROM sampleCalendar s
LEFT JOIN LATERAL getAdditionalInfoAboutDate(s.date) f_row ON TRUE
更多细节:
Record returned from function has columns concatenated【讨论】:
以上是关于将 postgres 函数与查询相结合的主要内容,如果未能解决你的问题,请参考以下文章
使用来自 Nodejs Postgres 查询的数据 [重复]