【问题标题】:How to INSERT INTO table from dynamic query?如何从动态查询中插入表?
【发布时间】:2016-03-15 16:12:22
【问题描述】:

我的 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

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

【问题讨论】:

  • @ErwinBrandstetter 在帖子中更新了版本。而且我不想在目标表中创建 100 行。 Table1 是源,Table2 是我的目标。我们可以忽略条件列。它们的列如何链接/映射存储在 Table3 中。挑战是将其动态化为动态 sql 并将其插入到目标表中。先生,我的问题与linklink 的帖子有链接
  • @ErwinBrandstetter 先生,我希望您能看到我的问题,因为我注意到您已经解决了很多 postgres 问题。感谢您实现愿望。
  • 我回滚了您上次的编辑并建议您为新问题开始一个新问题。你可以在edit history here找到你的版本。

标签: sql postgresql plpgsql dynamic-sql uniqueidentifier


【解决方案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 函数中并传递其他参数:

【讨论】:

  • 先生,这完全解决了一对一的映射问题。但是如果table1有三列,映射到table2中的三列怎么办。我在帖子中修改了相同的示例。
  • @HarsimranjeetSingh:请不要在给出答案后改变问题的性质。在我回答之前,我试图得到澄清 - 澄清总是受欢迎的,但改变问题的性质不是。为新问题开始一个新问题 - 您可以随时链接到这个问题以获得上下文。
  • 先生,我在link发布了同样的内容
  • 还有一个先生,我试图在查询窗口中运行这个自动化部分,它返回:错误:用作表达式的子查询返回多行上下文:SQL 语句“SELECT(SELECT 格式('INSERT INTO %I (%I) SELECT %I FROM %I' , tbl_des, col_des, col_src, tbl_src) As sql FROM md_formula -- WHERE table3_id = 123 -- 只选择一个行! )" PL/pgSQL function inline_code_block line 2 at EXECUTE 语句
  • 这种代码我们是不是一直都需要在plpgsql中包装,不能直接执行吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-08
相关资源
最近更新 更多