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_strings
是 on
,默认情况下从 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
。
我 运行正在使用 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_strings
是 on
,默认情况下从 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
。