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 пункт.

Связанные с:

Другие вопросы по тегам