Puoi usare la funzione C fornita crosstab_hash
per questo.
Il manuale non è molto chiaro al riguardo. È menzionato alla fine del capitolo su crosstab()
con due parametri:
È possibile creare funzioni predefinite per evitare di dover scrivere i nomi ei tipi di colonna dei risultati in ogni query. Vedere gli esempi nella sezione precedente. La funzione C sottostante per questa forma di crosstab
si chiama crosstab_hash
.
Per il tuo esempio:
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;
Chiama:
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');
Nota che devi creare un crosstab_hash
distinto funzione per ogni crosstab
funzione con un tipo di ritorno diverso.
Correlati:
- Riga PostgreSQL in colonne
La tua funzione per generare l'elenco delle colonne è piuttosto contorto, il risultato non è corretto (int
mancante dopo kernel_id
), può essere sostituito con questa query SQL:
SELECT 'kernel_id int, '
|| string_agg(DISTINCT key::text, ' int, ' ORDER BY key::text)
|| ' int, DUMMY text'
FROM test_db;
E comunque non può essere utilizzato dinamicamente.