sql >> Database >  >> RDS >> PostgreSQL

Hoe retourneer dynamisch aantal kolommen in functie?

Dit is mogelijk voor RECORD-retourfuncties.

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

En nu kun je het volgende doen:

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)

De zeer serieuze nadeel is dat elke keer dat je de functie aanroept je een reeks geretourneerde kolommen moet definiëren, dus ik denk niet dat je dit antwoord nuttig zult vinden:)

Hoe dan ook, Postgresql moet het geretourneerde type van elke SELECT weten voor het voert de query uit, dus je moet de kolommen op de een of andere manier definiëren.

JSON-retourwaarde kan een redelijk antwoord zijn als u alleen de gegevens wilt en het u niet uitmaakt of er afzonderlijke kolommen zijn of niet.



  1. De kracht van SQL en procedurele verklaringen combineren met MariaDB's Oracle-compatibiliteitsmodus

  2. MySQL:de beste manier om MAC-adressen op te slaan?

  3. MySQL-opgeslagen procedure veroorzaakte `Opdrachten niet gesynchroniseerd`

  4. Omzeil zelfreferentie in een DELETE-query