Разделить возвращенную функцией запись на несколько столбцов
В базовом руководстве по функциям Postgres есть пример сOUT
параметры вроде так:
create or replace function hi_lo(a numeric,
b numeric,
c numeric,
OUT hi numeric,
OUT lo numeric)
as $$
begin
hi := greatest(a, b, c);
lo := least(a, b, c);
end; $$
language plpgsql;
Тогда результаты выглядят как
select hi_lo(2, 3, 4);
-- returns one column, "hi_lo" with value "(4, 2)".
select * from hi_lo(2, 3, 4);
-- returns two columns, "hi" / 4 and "lo" / 2.
Но предположим, что вы хотите выполнить функцию для столбцов, полученных в результате объединения, и что у вас нет доступа для изменения функции или использования альтернативной функции? Например, используя некоторые игрушечные данные:
select hi_lo(a.actor_id, length(a.name), ma.movie_id)
from
actors a
join
movies_actors ma
on
a.actor_id = ma.movie_id
limit 10;
возвращает результаты в одном столбце "hi_lo" с двумя значениями кортежа.
Завершение запроса в скобках и попыткаselect *
из него не меняется формат вывода. Так
select *
from (
select hi_lo(a.actor_id, length(a.name), ma.movie_id)
from
actors a
join
movies_actors ma
on
a.actor_id = ma.movie_id
limit 10;
) rr
не влияет на форму результата.
Следующая попытка приводит к ошибке «подзапрос должен возвращать только один столбец»
select (
select * from hi_lo(a.actor_id, length(a.name), ma.movie_id)
)
from
actors a
join
movies_actors ma
on
a.actor_id = ma.movie_id
limit 10;
Наконец-то я тоже попробовалunnest
но это дает ошибку типа аргумента, поскольку значения кортежа не рассматриваются как массивы.
Как вы можете получить несколько столбцов в выводе, когда вы не можете переместить оценку функции вfrom
раздел?