Warm tip: This article is reproduced from serverfault.com, please click

postgresql-是否可以在INSERT INTO语句中使用查询的column_name?

(postgresql - Is it posible to use queried column_name in INSERT INTO statement?)

发布于 2020-11-27 22:40:51

询问:

SELECT string_agg(column_name::text, ',')
FROM information_schema.columns
WHERE table_name = 'my_table' and column_name !='id'

返回my_table中除“ id”以外的列的列表:

date_of_birth,first_name,last_name,e_mail

定义列名称时,我想在INSERT INTO语句中使用此列表。我应该怎么做,因为跟随不起作用。

INSERT INTO my_table2 (
    SELECT string_agg(column_name::text, ',')
    FROM information_schema.columns
    WHERE table_name = 'my_table' and column_name !='id'
    )
VALUES ('a', 'b', ...);

我在my_table2和my_table中更改了列数和顺序,因此必须自动分配名称。

Questioner
Algimantas Rainys
Viewed
11
Laurenz Albe 2020-11-28 10:43:27

你必须使用动态SQL,即从第一个查询的结果构造第二个查询。没有一个方法可以做到这一点。

随着psql\gexec,你可以使用

SELECT format($$INSERT INTO my_table2 (%s) VALUES ('a', 'b', ...)$$,
              string_agg(quote_ident(column_name), ', ')
             )
FROM information_schema.columns
WHERE table_name = 'my_table'
  AND column_name <> 'id' \gexec