To je možné pro funkce vracející 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$
;
A teď můžete:
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)
Velmi vážné nevýhodou je, že pokaždé, když zavoláte funkci, musíte definovat sadu vrácených sloupců, takže si nemyslím, že tato odpověď bude užitečná :)
Každopádně Postgresql potřebuje znát vrácený typ každého SELECT před spustí dotaz, takže jedním nebo druhým způsobem musíte definovat sloupce.
Návratová hodnota JSON by mohla být rozumnou odpovědí, pokud chcete pouze data a je vám jedno, zda existují samostatné sloupce nebo ne.