Divida o registro retornado pela função em várias colunas
Em um tutorial básico da função do Postgres, há um exemplo comOUT
parâmetros assim:
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;
Então os resultados parecem
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.
Mas suponha que você queira executar a função nas colunas que vêm da execução de uma junção e que você não tem acesso para modificar a função ou usar uma função alternativa? Por exemplo, usando alguns dados de brinquedos:
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;
retorna resultados em uma única coluna "hi_lo" com valores de 2 tuplas.
Envolvendo a consulta entre parênteses e tentando umselect *
a partir dele não altera o formato da saída. assim
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
não afeta a forma do resultado.
A tentativa a seguir resulta no erro "subconsulta deve retornar apenas uma coluna"
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;
Finalmente, eu também tenteiunnest
mas gera um erro de tipo de argumento, pois os valores da tupla não são tratados como matrizes.
Como você pode obter várias colunas na saída quando não pode mover a avaliação da função para ofrom
seção?