Първо, 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
колона. Подробно обяснение:
- PostgreSQL Crosstab Query
Функция
Или създайте функция, така че да не се налага да предоставяте списък с дефиниции на колони за всяко повикване:
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')