PostgreSQL RETURNING因REGEXP_REPLACE而失败

时间:2017-06-06 11:40:32

标签: sql node.js postgresql pg-promise 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中运行查询,它确实有效并返回一个不错的输出。

2 个答案:

答案 0 :(得分:1)

试图重现并失败:

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_strings on假设为psql,默认情况下使用off并且pg-prommise使用table_id

从vitaly-t更新

  

问题仅在于JavaScript文字转义,而不是   标志。

他在答案中进一步阐述了

答案 1 :(得分:1)

环境变量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, $1, $2)", ['^(\\+?|00)', 'replaced'])

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

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

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