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