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

PostgreSQL da riga a colonne

Prima di tutto, la crosstab() famiglia di funzioni non è installata in PostgreSQL standard. Devi installare l'estensione tablefunc per questo. In PostgreSQL 9.1 dovresti semplicemente:

CREATE EXTENSION tablefunc;

Per le versioni precedenti dai un'occhiata a questa risposta correlata.

Interrogazione

La query potrebbe essere simile a questa:

SELECT *
FROM   crosstab (
        'SELECT l.id
               ,c.column_name
               ,c.data
         FROM   custom_columns_table c
         JOIN   list_table l ON l.id = c.list_id
         ORDER  BY 1',

        'SELECT DISTINCT column_name
         FROM   custom_columns_table
         ORDER  BY 1')
AS tbl (
    id integer
   ,email text
   ,name text
   );

Uso il modulo di crosstab() con due parametri, perché ciò consente attributi mancanti. Come quando una persona non ha email. Quindi questo modulo restituirà NULL per l'email colonna. Spiegazione dettagliata:

  • Query a campi incrociati PostgreSQL

Funzione

Oppure crea una funzione in modo da non dover fornire un elenco di definizioni di colonna per ogni chiamata:

CREATE OR REPLACE FUNCTION f_mycross(text, text)
  RETURNS TABLE (
    id integer
   ,email text
   ,name text)
  AS '$libdir/tablefunc','crosstab_hash' LANGUAGE C STABLE STRICT;

Chiama:

SELECT * FROM f_mycross(
       'SELECT l.id
              ,c.column_name
              ,c.data
        FROM   custom_columns_table c
        JOIN   list_table l ON l.id = c.list_id
        ORDER  BY 1',
    
       'SELECT DISTINCT column_name
        FROM   custom_columns_table
        ORDER  BY 1')