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 动态列选择的主要内容,如果未能解决你的问题,请参考以下文章