PostgreSQL返回失败与REGEXP_REPLACE
我正在运行PostgreSQL 9.4,并将大量logging插入到我的数据库中。 插入后,我使用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中直接运行查询,它可以工作并返回一个很好的输出。
试图重现和失败:
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
所以阐述@pozsbuild议的理由是:
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, eg, E'\r\n'. ERROR: invalid regular expression: quantifier operand invalid
更新由于OP的作者说standard_conforming_strings
是从默认使用psql
从9.1假设,并与pg-prommise
从重要的更新
这个问题很简单,就是JavaScript文字的转义,而不是标志。
他在答复中进一步阐述
环境variablesstandard_conforming_strings
的当前值在这里是不重要的。 你可以看到它,如果你用SET standard_conforming_strings = true;
前缀查询SET standard_conforming_strings = true;
,这将不会改变。
传递从客户端未转义的regExstring与从命令行使用E
前缀相同: E'^(\+?|00)'
。
在JavaScript中,被视为一个特殊符号,并且只需要提供\\
来指示符号,这正是您正则expression式所需要的。
除此之外, pg-promise会正确地将所有内容都清除掉,下面是一个例子:
db.any("INSERT INTO users(name) VALUES('hello') RETURNING REGEXP_REPLACE(name, $1, $2)", ['^(\\+?|00)', 'replaced'])
要理解命令行如何工作,请在E
:前面加正则expression式string:
db.any("INSERT INTO users(name) VALUES('hello') RETURNING REGEXP_REPLACE(name, E$1, $2)", ['^(\\+?|00)', 'replaced'])
你会得到同样的错误: invalid regular expression: quantifier operand invalid
。