Во-первых, семейство функций crosstab()
не установлено в стандартном PostgreSQL.Для этого вам нужно установить расширение tablefunc
.В PostgreSQL 9.1 вы просто:
CREATE EXTENSION tablefunc;
Для более старых версий взгляните на этот связанный ответ .
Запрос
Запрос может выглядетькак это:
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
);
Я использую форму crosstab()
с двумя параметрами, потому что это позволяет пропустить атрибуты.Мол, когда у человека нет электронной почты.Тогда эта форма вернет NULL
для столбца email
.Подробное объяснение:
Функция
Или создайте функцию, чтобы вам не приходилось предоставлятьсписок определения столбца для каждого вызова:
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;
вызов:
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')