PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Générer dynamiquement des colonnes pour le tableau croisé dans PostgreSQL

Vous pouvez utiliser la fonction C fournie crosstab_hash pour cela.

Le manuel n'est pas très clair à ce sujet. C'est mentionné à la fin du chapitre sur crosstab() avec deux paramètres :

Vous pouvez créer des fonctions prédéfinies pour éviter d'avoir à écrire les noms et les types des colonnes de résultats dans chaque requête. Voir les exemples dans la section précédente. La fonction C sous-jacente pour cette forme de crosstab est nommé crosstab_hash .

Pour votre exemple :

CREATE OR REPLACE FUNCTION f_cross_test_db(text, text)
  RETURNS TABLE (kernel_id int, key1 int, key2 int, key3 int)
  AS '$libdir/tablefunc','crosstab_hash' LANGUAGE C STABLE STRICT;

Appel :

SELECT * FROM f_cross_test_db(
      'SELECT kernel_id, key, value FROM test_db ORDER BY 1,2'
     ,'SELECT DISTINCT key FROM test_db ORDER BY 1');

Notez que vous devez créer un crosstab_hash distinct fonction pour chaque crosstab fonction avec un type de retour différent.

Connexe :

  • Des lignes PostgreSQL aux colonnes

Votre fonction pour générer la liste des colonnes est plutôt alambiqué, le résultat est incorrect (int manquant après kernel_id ), il peut être remplacé par cette requête SQL :

SELECT 'kernel_id int, '
       || string_agg(DISTINCT key::text, ' int, '  ORDER BY key::text)
       || ' int, DUMMY text'
FROM   test_db;

Et il ne peut de toute façon pas être utilisé dynamiquement.