PostgreSQL 返回失败 REGEXP_REPLACE

PostgreSQL RETURNING fails with REGEXP_REPLACE

我 运行正在使用 PostgreSQL 9.4 并向我的数据库中插入大量记录。我在插入后使用 RETURNING 子句进一步使用。

当我只是 运行:

... RETURNING my_car, brand, color, contact

一切正常,但如果我尝试使用 REGEXP_REPLACE,它会失败:

... RETURNing my_car, brand, color, REGEXP_REPLACE(contact, '^(\+?|00)', '') AS contact

它失败了:

ERROR: invalid regular expression: quantifier operand invalid

如果我只是 运行 直接在 PostgreSQL 中查询,它确实有效并且 return 一个不错的输出。

尝试重现失败:

t=# create table s1(t text);
CREATE TABLE
t=# insert into s1 values ('+4422848566') returning REGEXP_REPLACE(t, '^(\+?|00)', '');
 regexp_replace
----------------
 4422848566
(1 row)

INSERT 0 1

这么详细@pozs建议的原因:

set standard_conforming_strings to off;

导致

WARNING:  nonstandard use of escape in a string literal
LINE 1: ...alues ('+4422848566') returning REGEXP_REPLACE(t, '^(\+?|00)...
                                                             ^
HINT:  Use the escape string syntax for escapes, e.g., E'\r\n'.
ERROR:  invalid regular expression: quantifier operand invalid

更新 正如 OP 作者所说,standard_conforming_stringson,默认情况下从 9.1 开始使用 psql 并且 off 使用 pg-prommise

从vitaly-t更新

The issue is simply with the JavaScript literal escaping, not with the flag.

他在回答中进一步阐述

环境变量 standard_conforming_strings 的当前值在这里无关紧要。如果您在查询前加上 SET standard_conforming_strings = true; 前缀就可以看到它,这不会改变任何内容。

从客户端传入未转义的 regEx 字符串与从命令行使用 E 前缀相同:E'^(\+?|00)'.

在 JavaScript 中,\ 被视为特殊符号,您只需始终提供 \ 来指示该符号,这是您的正则表达式所需要的。

除此之外,pg-promise 将正确转义所有内容,这是一个示例:

db.any("INSERT INTO users(name) VALUES('hello') RETURNING REGEXP_REPLACE(name, , )", ['^(\+?|00)', 'replaced'])

要了解命令行的工作原理,请在正则表达式字符串前加上 E:

db.any("INSERT INTO users(name) VALUES('hello') RETURNING REGEXP_REPLACE(name, E, )", ['^(\+?|00)', 'replaced'])

你会得到同样的错误:invalid regular expression: quantifier operand invalid