Ini dimungkinkan untuk fungsi pengembalian 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$
;
Dan sekarang Anda dapat melakukan:
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)
sangat serius downside adalah bahwa setiap kali Anda memanggil fungsi, Anda harus mendefinisikan set kolom yang dikembalikan, jadi saya rasa Anda tidak akan menemukan jawaban ini berguna:)
Bagaimanapun, Postgresql perlu mengetahui tipe yang dikembalikan dari setiap SELECT sebelum itu menjalankan kueri, jadi dengan satu atau lain cara Anda harus mendefinisikan kolom.
Nilai pengembalian JSON bisa menjadi jawaban yang masuk akal jika Anda hanya menginginkan data dan tidak peduli apakah ada kolom terpisah atau tidak.