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