PostgreSQL 动态列选择

Posted

技术标签:

【中文标题】PostgreSQL 动态列选择【英文标题】:PostgreSQL dynamic column selection 【发布时间】:2021-10-13 10:19:34 【问题描述】:

我在一些动态的 postgresql 上有点挣扎: 我有一个名为“list_columns”的表,其中包含以“column_name”作为变量名的列名列表;这些列名来自一个名为“input_table”的输入表。

[list_columns]

column_name
col_name_a
col_name_b
col_name_c...

[输入表]

col_name_a col_name_b col_name_c col_name_d col_name_e
value_a_1 value_b_1 value_c_1 value_d_1 value_e_1
value_a_2 value_b_2 value_c_2 value_d_2 value_e_2
... ... ... ... ...

我想做的是使用该列表动态创建一个新表,如下所示:

create table output_table as
select (select distinct(column_name) seperated by "," from list_columns) from input_table;

结果表将是 [输出表]

col_name_a col_name_b col_name_c
value_a_1 value_b_1 value_c_1
value_a_2 value_b_2 value_c_2
... ... ...

我看到我应该使用一些执行程序,但我不知道该怎么做。

注意:我知道我可以直接选择 3 列;我把这个案子简单化了。

如果有人愿意在这方面帮助我,

谢谢你, 问候, 乔纳森

【问题讨论】:

与您的问题无关,但是:Postgres 9.4 是no longer supported,您应该尽快计划升级。 【参考方案1】:

为此您需要动态 SQL,为此您需要 PL/pgSQL。

您需要根据input_table 组装CREATE TABLE 语句,然后运行生成的SQL。

do
$$
declare
  l_columns text;
  l_sql text;
begin
  -- this generates the list of columns
  select string_agg(distinct column_name, ',')
    into l_columns
  from list_table;

  -- this generates the actual CREATE TABLE statement using the columns
  -- from the previous step
  l_sql := 'create table output_table as select '||l_columns||' from input_table';

  -- this runs the generated SQL, thus creating the output table.
  execute l_sql;
end;
$$;

如果你需要很多,你可以把它放到一个存储函数中(你不支持的 Postgres 版本不支持真正的过程)。

【讨论】:

非常感谢!效果很好!

以上是关于PostgreSQL 动态列选择的主要内容,如果未能解决你的问题,请参考以下文章

PostgreSQ 连接问题 FATAL: no pg_hba.conf entry for host

Postgresq9.6主从部署

PostgreSQL 动态列数结果

具有动态列名和多个输入列的 PostgreSQL 交叉表

如何在 Postgresql 交叉表中获取动态列数

Postgresql函数用动态表名创建表?