PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Como retornar o número dinâmico de colunas na função?


Isso é possível para funções de retorno RECORD.
CREATE FUNCTION calculation(how_many integer) RETURNS SETOF RECORD
LANGUAGE plpgsql
AS $fff$
BEGIN
    IF how_many = 1
        THEN RETURN QUERY SELECT 'foo'::text;
    ELSIF how_many = 2
        THEN RETURN QUERY SELECT 'foo'::text, 'bar'::text;
    END IF;
END;
$fff$
;

E agora você pode fazer:
jbet=> SELECT * FROM calculation(1) AS f(first_col text);
 first_col
-----------
 foo
(1 row)

jbet=> SELECT * FROM calculation(2) AS f(first_col text, second_col text);
 first_col | second_col
-----------+------------
 foo       | bar
(1 row)

O muito sério A desvantagem é que cada vez que você chama a função, você precisa definir um conjunto de colunas retornadas, então não acho que você achará essa resposta útil:)

De qualquer forma, o Postgresql precisa saber o tipo retornado de cada SELECT antes ele executa a consulta, então uma ou outra maneira você tem que definir as colunas.

O valor de retorno JSON pode ser uma resposta razoável se você deseja apenas os dados e não se importa se há colunas separadas ou não.