如何从动态查询中插入 table?
How to INSERT INTO table from dynamic query?
我的 Postgres 版本是:
"PostgreSQL 9.4.4, compiled by Visual C++ build 1800, 32-bit"
假设我有两个 table Table1
和 Table2
,它们分别有 col1
和 col2
列。
CREATE TABLE Table1(col1 int);
CREATE TABLE Table2(col2 int);
还有一个table 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
如何在动态查询中编译此公式并插入到目标中table?
动态构建命令的基本查询:
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 命令中不带引号的标识符自动折叠为小写不同,table 中的字符串现在区分大小写!
- Are PostgreSQL column names case-sensitive?
我建议您永远不要 双引号标识符,只使用合法的小写名称。
自动化:
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()
function. Read the manual。
您也可以将其包装到 plpgsql 函数中并传递其他参数:
- Table name as a PostgreSQL function parameter
我的 Postgres 版本是:
"PostgreSQL 9.4.4, compiled by Visual C++ build 1800, 32-bit"
假设我有两个 table Table1
和 Table2
,它们分别有 col1
和 col2
列。
CREATE TABLE Table1(col1 int);
CREATE TABLE Table2(col2 int);
还有一个table 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
如何在动态查询中编译此公式并插入到目标中table?
动态构建命令的基本查询:
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 命令中不带引号的标识符自动折叠为小写不同,table 中的字符串现在区分大小写!
- Are PostgreSQL column names case-sensitive?
我建议您永远不要 双引号标识符,只使用合法的小写名称。
自动化:
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()
function. Read the manual。
您也可以将其包装到 plpgsql 函数中并传递其他参数:
- Table name as a PostgreSQL function parameter