Ten eerste, de crosstab()
familie van functies is niet geïnstalleerd in standaard PostgreSQL. U moet de extensie tablefunc
. installeren voor deze. In PostgreSQL 9.1 zou je simpelweg:
CREATE EXTENSION tablefunc;
Bekijk voor oudere versies dit gerelateerde antwoord.
Zoekopdracht
De zoekopdracht kan er als volgt uitzien:
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
);
Ik gebruik de vorm van crosstab()
met twee parameters, want dat zorgt voor ontbrekende attributen. Zoals, wanneer een persoon geen e-mail heeft. Dan retourneert dit formulier NULL
voor de email
kolom. Gedetailleerde uitleg:
- PostgreSQL-kruistabelquery
Functie
Of maak een functie aan zodat u niet voor elke aanroep een kolomdefinitielijst hoeft aan te leveren:
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;
Bel:
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')