Jest to możliwe dla funkcji zwracających 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 teraz możesz zrobić:
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)
Bardzo poważna Minusem jest to, że za każdym razem, gdy wywołujesz funkcję, musisz zdefiniować zestaw zwracanych kolumn, więc nie sądzę, że ta odpowiedź będzie przydatna :)
W każdym razie Postgresql musi znać zwrócony typ każdego SELECT przed uruchamia zapytanie, więc w taki czy inny sposób musisz zdefiniować kolumny.
Wartość zwracana JSON może być rozsądną odpowiedzią, jeśli chcesz tylko danych i nie obchodzi cię, czy istnieją oddzielne kolumny, czy nie.