sql >> Database teknologi >  >> RDS >> PostgreSQL

Hvordan returnerer dynamisk antal kolonner i funktion?

Dette er muligt for RECORD returnerende funktioner.

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$
;

Og nu kan du gøre:

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)

Den meget alvorlige Ulempen er, at hver gang du kalder funktionen skal du definere sæt af returnerede kolonner, så jeg tror ikke, du vil finde dette svar nyttigt :)

Under alle omstændigheder skal Postgresql kende den returnerede type af hver SELECT før den kører forespørgslen, så på en eller anden måde skal du definere kolonnerne.

JSON-returværdi kunne være et rimeligt svar, hvis du bare vil have dataene og er ligeglad med, om der er separate kolonner eller ej.



  1. hvorfor kan denne mysql-begivenhed ikke køres?

  2. Sådan formateres SQLite-resultater som en tabel

  3. mysql konverterer flere rækker til kolonner i en enkelt række

  4. udfør øjeblikkelig ikke at vise registreringer af Dynamic Select-sætning