将postgres功能与查询相结合

时间:2014-11-16 19:30:24

标签: sql postgresql sql-function

我目前在我的结果集中需要输出sql-function的输出:

SELECT getAdditionalInfoAboutDate(date) from sampleCalendar

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

  1. " Attribute1,Attribute2,Attribute3"
  2. " Attribute2,Attribute3,Attribute4"
  3. ...
  4. 正如你所看到的,我得到了我想要的结果,但它只有一列,即使我的函数返回3列。

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

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

    我得到异常"子查询必须只返回一列"。

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

    编辑:找到答案HERE,即:

    SELECT getAdditionalInfoAboutDate(date).* from sampleCalendar
    

1 个答案:

答案 0 :(得分: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

更多详情: