在 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
我正在 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