我正在运行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中运行查询,它确实有效并返回一个不错的输出。
答案 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
。