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

Is it posible to use queried column_name in INSERT INTO statement?

查询:

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

returns 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 中的列数和顺序,因此我必须自动分配名称。

您必须使用动态 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