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.