PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Generieren Sie dynamisch Spalten für Kreuztabellen in PostgreSQL

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.