我正在尝试创建一个动态系统,允许用户从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.详细说明:
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')