如何从动态查询INSERT INTO表?

时间:2015-12-10 06:10:29

标签: sql postgresql plpgsql dynamic-sql uniqueidentifier

我的Postgres版本是:

"PostgreSQL 9.4.4, compiled by Visual C++ build 1800, 32-bit"

假设我有两个表Table1Table2,它们分别有col1col2列。

CREATE TABLE Table1(col1 int);
CREATE TABLE Table2(col2 int);

另一个表格Table3存储了将数据从Table1迁移到Table2的公式:

CREATE TABLE Table3 (     
  tbl_src   varchar(200),
  col_src   varchar(500),
  tbl_des   varchar(200),
  col_des   varchar(100),
  condition varchar(500)
);

INSERT INTO Table3 (tbl_src, col_src, tbl_des, col_des, condition)
SELECT 'Table1','col1','Table2','col2',NULL

如何在动态查询中编译此公式并插入目标表?

1 个答案:

答案 0 :(得分:1)

动态构建命令的基本查询:

SELECT format('INSERT INTO %I (%I) SELECT %I FROM %I'
            , tbl_des, col_des, col_src, tbl_src) As sql
FROM   table3;

这会生成如下查询:

INSERT INTO "Table2" (col2) SELECT col1 FROM "Table1"

请注意引用的大写拼写。与SQL命令不同,不带引号的标识符会自动折叠为小写,表格中的字符串现在区分大小写!

我建议你从不双引号标识符,并专门使用合法的小写名称。

自动化:

DO
$$BEGIN
   EXECUTE (
      SELECT format('INSERT INTO %I (%I) SELECT %I FROM %I'
                  , tbl_des, col_des, col_src, tbl_src) As sql
      FROM   table3
      -- WHERE table3_id = 123  -- select only *one* row!
      );
END$$;

需要才能理解format()功能。 Read the manual

您也可以将其包装到plpgsql函数中并传递其他参数: