【问题标题】:Is it posible to use queried column_name in INSERT INTO statement?是否可以在 INSERT INTO 语句中使用查询列名?
【发布时间】: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 中更改了列数和顺序,所以我必须自动分配名称。

【问题讨论】:

  • my_table2 和 my_table 列数不匹配。

标签: postgresql insert assign


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-25
    • 2014-09-05
    • 1970-01-01
    • 2021-10-30
    • 1970-01-01
    • 1970-01-01
    • 2018-12-13
    • 1970-01-01
    相关资源
    最近更新 更多