postgres: как вызвать функцию, которая возвращает таблицу и передает параметры из запроса
В качестве мгновенного примера:
Функция, которая возвращает таблицу:
=> create or replace function testf(x integer)
returns table(a integer, b integer)
language sql
as $function$
select * from (values(1,2)) as foo(a,b)
$function$;
Вызывая его, он возвращает запись (или как вы ее называете):
=> select testf(3);
testf
-------
(1,2)
Вызывая его, он возвращает таблицу (хорошо):
=> select * from testf(3);
a | b
---+---
1 | 2
Но как я могу назвать это так, чтобы параметры пришли из запроса?
=> select s.n, testf(s.n) from (select 3 as n union select 4) s;
n | testf
---+-------
3 | (1,2)
4 | (1,2) <-- not a table (or row with column names)
=> select * from testf(s.n) from (select 3 as n) s;
ERROR: syntax error at or near "from" LINE 1: select * from testf(s.n) from (select 3 as n) s;
1 ответ
Использовать LATERAL
подзапрос:
SELECT *
FROM (VALUES (3), (4)) AS s(n)
, testf(s.n);
Запятая - это краткое обозначение CROSS JOIN LATERAL
, поскольку LATERAL
предполагается автоматически с набором возвращающих функций в FROM
пункт.
Связанные с: