将 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 函数与查询相结合的主要内容,如果未能解决你的问题,请参考以下文章

结合关系查询提高 Postgres jsonb 查询的性能

postgres函数之游标

带有 jsonb 参数的 Postgres 函数

使用来自 Nodejs Postgres 查询的数据 [重复]

将 Async/Await 与 node-postgres 一起使用

POSTGRES:选择从函数返回的引用的查询