【问题标题】:Combine postgres function with query将 postgres 函数与查询相结合
【发布时间】:2014-11-16 19:30:24
【问题描述】:

我目前正在处理我的结果集中需要的 sql 函数的输出:

SELECT getAdditionalInfoAboutDate(date) from sampleCalendar

问题是,我通过以下方式得到结果:

  1. “属性1、属性2、属性3”
  2. “属性2、属性3、属性4”
  3. ...

如您所见,我得到了我想要的结果,但即使我的函数返回 3 列,它也只有一列。

当我尝试创建如下语句时:

SELECT (Select * from getAdditionalInfoAboutDate(date)) from sampleCalendar

我收到异常“子查询必须只返回一列”。

我有机会以某种方式解决这个问题吗?

编辑:找到答案HERE,即:

SELECT getAdditionalInfoAboutDate(date).* from sampleCalendar

【问题讨论】:

  • 让函数也返回日期然后执行select * from getAdditionalInfoAboutDate(date)怎么样?
  • 这也会导致“子查询必须只返回一列”
  • 什么是类型或返回值? record ?您能否提供更多有关您的功能的代码?
  • 没关系,看看我编辑的问题 - 在另一个线程中找到答案!

标签: sql postgresql sql-function


【解决方案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

更多细节:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 2019-03-17
    • 2018-02-22
    • 1970-01-01
    • 2011-02-28
    • 2023-02-10
    • 1970-01-01
    相关资源
    最近更新 更多