2

我有一个名为 generate_table 的函数,它需要 2 个输入参数(rundate::datebranch::varchar

现在我正在尝试使用 PLPGSQL 处理第二个函数,它将获取所有分支的列表和每个分支的最新日期,并将其作为参数传递给 generate_table 函数。

我的查询是这样的:

select max(rundate) as rundate, branch
from t_index_of_imported_files
group by branch

结果是:

rundate;branch 
2014-03-13;branch1
2014-03-12;branch2
2014-03-10;branch3
2014-03-13;branch4

我需要的是函数运行这样的东西

select generate_table('2014-03-13';'branch1');
select generate_table('2014-03-12';'branch2');
select generate_table('2014-03-10';'branch3');
select generate_table('2014-03-13';'branch4');

我已经阅读了很多关于 PLPGSQL 的内容,但到目前为止我只能说我几乎不了解基础知识。

我读到可以使用串联来将所有值放在一起,然后在函数中使用 EXECUTE,但我无法使其正常工作。

关于如何做到这一点的任何建议?

4

3 回答 3

2

您可以使用LATERAL JOINPostgres 9.3+中的新功能通过简单的 SELECT 查询来执行此操作

SELECT *
FROM  (
   SELECT max(rundate) AS rundate, branch
   FROM   t_index_of_imported_files
   GROUP  BY branch
   ) t
 , generate_table(t.rundate, t.branch) g;  -- LATERAL is implicit here

根据文档:

LATERAL也可以在函数调用FROM项之前,但在这种情况下它是一个干扰词,因为函数表达式在任何情况下都可以引用更早的FROM项。

在旧版本中也可以通过扩展SELECT列表中的集合返回函数的行来实现,但新的语法 withLATERAL更简洁。无论如何,对于 Postgres 9.2 或更早版本:

SELECT generate_table(max(rundate), branch)
FROM   t_index_of_imported_files
GROUP  BY branch;
于 2014-03-14T16:33:06.067 回答
0
select generate_table(max(rundate) as rundate, branch)
from t_index_of_imported_files
group by branch
于 2014-03-14T16:43:43.633 回答
0

不需要做任何太花哨的事情。

SELECT generate_table(rundate,branch) FROM (
    SELECT max(rundate) AS rundate, branch
    FROM t_index_of_imported_files
    GROUP BY branch) x;
于 2014-03-14T16:43:50.183 回答