PostgreSQL строки в столбцы - PullRequest
2 голосов
/ 06 марта 2012

Я пытаюсь создать динамическую систему, которая позволяет пользователям импортировать списки данных из Excel, поэтому мне нужны динамические столбцы, например:

custom_columns_table
id   list_id  data_type       column_name  data              ....
1    1        VARCHAR(255)    email        jhon@example.com  ....
2    1        VARCHAR(255)    name         Jhon              ....

list_table
id
1

Мне нужен такой результат:

id email             name  ....
1  jhon@example.com  Jhon  ....

Я нашел несколько примеров использования кросс-таблицы, но я не знаю, будет ли она работать в этом случае.

Кто-нибудь знает, как я могу это сделать?

1 Ответ

7 голосов
/ 07 марта 2012

Во-первых, семейство функций 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')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...