PostgreSQL行到列

PostgreSQL行到列,sql,postgresql,row,crosstab,Sql,Postgresql,Row,Crosstab,我正在尝试创建一个动态系统,允许用户从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

我正在尝试创建一个动态系统,允许用户从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  ....
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
   );
我发现了一些使用交叉表的例子,但我不知道它在这种情况下是否有效


有人知道我该怎么做吗?

首先,标准PostgreSQL中没有安装
crosstab()
函数系列。您需要为此安装扩展。在PostgreSQL 9.1中,您只需:

CREATE EXTENSION tablefunc;
对于较旧的版本,请看这个

查询 查询可能如下所示:

id email             name  ....
1  jhon@example.com  Jhon  ....
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
。详细说明:

作用 或者创建一个函数,这样就不必为每个调用提供列定义列表:

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;
电话: