Générer dynamiquement des colonnes de tableau croisé dans PostgreSQL

Je suis en train de créer crosstab requêtes de PostgreSQL tel qu'il génère automatiquement les crosstab colonnes au lieu de coder en dur. J'ai écrit une fonction qui génère dynamiquement la liste des colonnes que j'ai besoin pour mon crosstab requête. L'idée est de remplacer le résultat de cette fonction dans le crosstab requête à l'aide de sql dynamique.

Je sais comment le faire facilement dans SQL Server, mais mon peu de connaissance de PostgreSQL est entravant ma progression ici. Je pensais stocker le résultat de la fonction qui génère la dynamique de la liste de colonnes dans une variable et l'utiliser pour générer dynamiquement la requête sql. Il serait génial si quelqu'un pouvait me guider sur le même sujet.


-- Table which has be pivoted
CREATE TABLE test_db
(
    kernel_id int,
    key int,
    value int
);

INSERT INTO test_db VALUES
(1,1,99),
(1,2,78),
(2,1,66),
(3,1,44),
(3,2,55),
(3,3,89);


-- This function dynamically returns the list of columns for crosstab
CREATE FUNCTION test() RETURNS TEXT AS '
DECLARE
    key_id int;
    text_op TEXT = '' kernel_id int, '';
BEGIN
    FOR key_id IN SELECT DISTINCT key FROM test_db ORDER BY key LOOP
    text_op := text_op || key_id || '' int , '' ;
    END LOOP;
    text_op := text_op || '' DUMMY text'';
    RETURN text_op;
END;
' LANGUAGE 'plpgsql';

-- This query works. I just need to convert the static list
-- of crosstab columns to be generated dynamically.
SELECT * FROM
crosstab
(
    'SELECT kernel_id, key, value FROM test_db ORDER BY 1,2',
    'SELECT DISTINCT key FROM test_db ORDER BY 1'
)
AS x (kernel_id int, key1 int, key2 int, key3 int); -- How can I replace ..
-- .. this static list with a dynamically generated list of columns ?

OriginalL'auteur invinc4u | 2012-10-14