Först och främst, crosstab()
familj av funktioner är inte installerad i standard PostgreSQL. Du måste installera tillägget tablefunc
för detta. I PostgreSQL 9.1 skulle du helt enkelt:
CREATE EXTENSION tablefunc;
För äldre versioner, ta en titt på detta relaterade svar.
Fråga
Frågan kan se ut så här:
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
);
Jag använder formen crosstab()
med två parametrar, eftersom det tillåter saknade attribut. Som när en person inte har någon e-post. Då returnerar detta formulär NULL
för email
kolumn. Detaljerad förklaring:
- PostgreSQL Crosstab Query
Funktion
Eller skapa en funktion så att du inte behöver ange en kolumndefinitionslista för varje anrop:
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;
Ring:
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')