我的Postgres版本是:
“PostgreSQL 9.4.4, compiled by Visual C++ build 1800, 32-bit” 假设我有两个表Table1和Table2,分别具有columncol1和col2。
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
如何在动态查询中编译此公式并将其插入目标表?
动态构建命令的基本查询:
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命令不同,在SQL命令中,未加引号的标识符自动折叠为小写字母,而表中的字符串现在区分大小写!
PostgreSQL列名称区分大小写吗? 我建议您不要双引号标识符,而只能使用合法的小写名称。
自动化:
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()功能。阅读手册。