Funktion zurückgegebener Datensatz in mehrere Spalten aufteilen

In einem grundlegenden Tutorial zu Postgres-Funktionen gibt es ein Beispiel mitOUT Parameter wie folgt:

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;

Dann sehen die Ergebnisse aus wie

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.

Aber nehmen Sie an, Sie möchten die Funktion für Spalten ausführen, die aus einer Verknüpfung stammen, und Sie haben keinen Zugriff, um die Funktion zu ändern oder eine alternative Funktion zu verwenden? Zum Beispiel mit einigen Spielzeugdaten:

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;

returns ergibt in einer einzigen Spalte "hi_lo" 2-Tupel-Werte.

Wrapping die Abfrage in Klammern und versuchen, einselect * from ändert das Format der Ausgabe nicht. S

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

beeinflusst die Ergebnisform nicht.

Der folgende Versuch führt zu dem Fehler "Unterabfrage darf nur eine Spalte zurückgeben"

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;

Schließlich habe ich auch versuchtunnest aber es gibt einen Argumenttypfehler, da die Tupelwerte nicht als Arrays behandelt werden.

Wie können Sie mehrere Spalten in der Ausgabe erreichen, wenn Sie die Funktionsbewertung nicht in das @ verschieben könnefrom Sektion

Antworten auf die Frage(2)

Ihre Antwort auf die Frage