Sie können die bereitgestellte C-Funktion crosstab_hash
verwenden dafür.
Die Anleitung ist diesbezüglich nicht sehr übersichtlich. Es wird am Ende des Kapitels über crosstab()
erwähnt mit zwei Parametern:
Sie können vordefinierte Funktionen erstellen, um zu vermeiden, dass Sie die Namen und Typen der Ergebnisspalten in jeder Abfrage ausschreiben müssen. Siehe die Beispiele im vorherigen Abschnitt. Die zugrunde liegende C-Funktion für diese Form der crosstab
heißt crosstab_hash
.
Für Ihr Beispiel:
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;
Aufruf:
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');
Beachten Sie, dass Sie einen eigenen crosstab_hash
erstellen müssen Funktion für jede crosstab
Funktion mit einem anderen Rückgabetyp.
Verwandte:
- PostgreSQL-Zeile in Spalten
Ihre Funktion zum Generieren der Spaltenliste ziemlich kompliziert ist, ist das Ergebnis falsch (int
fehlt nach kernel_id
), kann sie durch diese SQL-Abfrage ersetzt werden:
SELECT 'kernel_id int, '
|| string_agg(DISTINCT key::text, ' int, ' ORDER BY key::text)
|| ' int, DUMMY text'
FROM test_db;
Und es kann ohnehin nicht dynamisch verwendet werden.