在 Postgres (plpgsql) 中用单引号替换双引号

Replace double quotes with single quotes in Postgres (plpgsql)

我正在 plpgsql 中为我的分区 table 构建一个触发器函数,我的所有逻辑都在工作,但是我无法将实际记录插入我的 table。

我必须通过变量引用来引用我的特定 table,因此(据我所知)迫使我使用 EXECUTE 命令,如下所示:

EXECUTE 'INSERT INTO ' || tablename || ' VALUES ' || NEW.*;

但是,这不会以 Postgres 的 INSERT 函数可以理解的方式处理解压缩存储在 NEW 中的记录。它将记录转换为字符串,同时保留其中的所有双引号。 IE。以上在执行时变为以下内容:

INSERT INTO cfs_hgt_05152016_05202016
VALUES ("2016-05-16 00:00:00","2016-05-12 06:00:00",HGT,"1000 mb",9,-71,-38.5371)

问题是 Postgres 认为这些值现在是由于双引号引起的列。

COPY cfs_hgt_master, line 1: ""2016-05-16 00:00:00","2016-05-12 06:00:00","HGT","1000 mb",9,-71,-38.5371"
ERROR:  column "2016-05-16 00:00:00" does not exist

我尝试通过以下方式解决此问题:

record_text := regexp_replace(NEW.*, '"', '\'', 'gi');
EXECUTE 'INSERT INTO ' || tablename || ' VALUES ' || record_text;

但是像这样转义单引号会产生错误:

psql:cfs_hgt_trigger_function.sql:36: ERROR:  unterminated quoted string at or near "' || record_text;
LINE 30: ...  EXECUTE 'INSERT INTO ' || tablename || ' VALUES ' || recor...
                                                              ^

有人可以帮我弄清楚如何正确转义该单引号,或者建议其他方法来完成我的任务吗?

根本不要将 转换为它们的文本表示。使用 USING clause of EXECUTE.

传递值

并正确转义 table 名称。您可以为此使用 format()

EXECUTE format('INSERT INTO %I SELECT .*', tablename)
USING NEW;

详情:

  • INSERT with dynamic table name in trigger function