sql >> Base de Datos >  >> RDS >> PostgreSQL

¿Cómo devolver el número dinámico de columnas en función?

Esto es posible para las funciones de retorno de 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$
;

Y ahora puedes hacer:

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)

La muy grave el inconveniente es que cada vez que llama a la función tiene que definir un conjunto de columnas devueltas, por lo que no creo que encuentre útil esta respuesta :)

De todos modos, Postgresql necesita saber el tipo devuelto de cada SELECT antes ejecuta la consulta, por lo que de una u otra forma debe definir las columnas.

El valor de retorno de JSON podría ser una respuesta razonable si solo desea los datos y no le importa si hay columnas separadas o no.