#postgresql-9.4
#postgresql-9.4
Вопрос:
Я немного затрудняюсь с некоторыми динамическими postgresql: у меня есть таблица с именем «list_columns», содержащая список имен столбцов с «column_name» в качестве имени переменной; эти имена столбцов взяты из входной таблицы с именем «input_table».
[список столбцов]
имя_столбца |
---|
col_name_a |
col_name_b |
col_name_c… |
[входная таблица]
col_name_a | col_name_b | col_name_c | col_name_d имя столбца | col_name_e имя столбца |
---|---|---|---|---|
значение_а_1 | value_b_1 | значение_c_1 | value_d_1 | значение_е_1 |
значение_а_2 | value_b_2 | value_c_2 | value_d_2 | значение_е_2 |
… | … | … | … | … |
Что я хотел бы сделать, это динамически создать новую таблицу, используя этот список, что-то вроде этого:
create table output_table as
select (select distinct(column_name) seperated by "," from list_columns) from input_table;
Результирующая таблица будет иметь
вид [output_table]
col_name_a | col_name_b | col_name_c |
---|---|---|
значение_а_1 | value_b_1 | значение_c_1 |
значение_а_2 | value_b_2 | value_c_2 |
… | … | … |
Я видел, что мне следует использовать некоторые процедуры выполнения, но я не могу понять, как это сделать.
Примечание: Я знаю, что мог бы напрямую выбрать 3 столбца; Я упростил дело.
Если кто-нибудь будет достаточно любезен, чтобы помочь мне в этом,
Спасибо, с уважением, Джонатан
Комментарии:
1. Не имеет отношения к вашей проблеме, но: Postgres 9.4 больше не поддерживается , вам следует запланировать обновление как можно скорее.
Ответ №1:
Для этого вам нужен динамический SQL, а для этого вам нужен PL / pgSQL.
Вам нужно собрать CREATE TABLE
инструкцию на основе input_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 не поддерживает реальные процедуры).
Комментарии:
1. Большое вам спасибо! Он отлично работает!