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

PostgreSQL-Zeile zu Spalten

Zuerst die crosstab() Funktionsfamilie ist nicht in Standard-PostgreSQL installiert. Sie müssen die Erweiterung tablefunc installieren dafür. In PostgreSQL 9.1 würden Sie einfach:

CREATE EXTENSION tablefunc;

Für ältere Versionen siehe diese verwandte Antwort.

Abfrage

Die Abfrage könnte so aussehen:

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
   );

Ich verwende die Form crosstab() mit zwei Parametern, da dadurch fehlende Attribute berücksichtigt werden. Zum Beispiel, wenn eine Person keine E-Mail hat. Dann gibt dieses Formular NULL zurück für die email Säule. Ausführliche Erklärung:

  • PostgreSQL-Kreuztabellenabfrage

Funktion

Oder erstellen Sie eine Funktion, damit Sie nicht für jeden Aufruf eine Spaltendefinitionsliste angeben müssen:

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;

Aufruf:

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')