PostgreSQL行到列

前端之家收集整理的这篇文章主要介绍了PostgreSQL行到列前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试创建一个动态系统,允许用户从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  ....

我找到了一些使用交叉表的例子,但我不知道它是否适用于这种情况.

有谁知道我怎么能这样做?

首先,在标准的Postgresql中没有安装crosstab()系列函数.您需要为此安装扩展 tablefunc.在Postgresql 9.1中你只需:
CREATE EXTENSION tablefunc;

对于旧版本,请查看此related answer.

询问

查询可能如下所示:

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.详细说明:

> PostgreSQL Crosstab Query

功能

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

CREATE OR REPLACE FUNCTION f_mycross(text,text)
  RETURNS TABLE (
    id integer,name text)
  AS '$libdir/tablefunc','crosstab_hash' LANGUAGE C STABLE STRICT;

呼叫:

SELECT * FROM f_mycross(
       'SELECT l.id,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')

猜你在找的Postgre SQL相关文章