PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Genera dinamicamente colonne per campi incrociati in PostgreSQL

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.