Динамически выполнять запрос с использованием вывода другого запроса

У меня есть функция с именем generate_table, которая принимает 2 входных параметра (rundate::date и branch::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 внутри этой функции, но я не смог заставить ее работать правильно.

Любые предложения о том, как это сделать?

Ответ 1

Вы можете сделать это с помощью простого запроса SELECT, используя новый LATERAL JOIN в Postgres 9.3 +

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, но в этом case это шумовое слово, потому что выражение функции может ссылаться на ранее FROM элементов в любом случае.

То же самое можно сделать в более старых версиях путем расширения строк для функций set-return в списке SELECT, но новый синтаксис с LATERAL намного чище. Во всяком случае, для Postgres 9.2 и старше:

SELECT generate_table(max(rundate), branch)
FROM   t_index_of_imported_files
GROUP  BY branch;

Ответ 2

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

Ответ 3

Нет необходимости делать что-то слишком необычное.

SELECT generate_table(rundate,branch) FROM (
    SELECT max(rundate) AS rundate, branch
    FROM t_index_of_imported_files
    GROUP BY branch) x;