替换正则表达式在postgresql中不起作用

时间:2017-01-31 14:05:48

标签: regex postgresql sql-update

我有一个包含字符串列的表。在字符串中有单引号,我想摆脱所有单引号。例如:

"''hey, hey, we're the monkees''"

我的正则表达式完美无缺,并选择包含单引号的所有值。

select regexp_replace(colName, '%''%', '') from tblName;

但是当我想用任何东西替换这个正则表达式时,它不会更新我的表。

UPDATE tblName SET colName = regexp_replace(colName, '%''%', '');

我也检查过这个

UPDATE tblName SET colName = replace(colName, '%''%', '');

2 个答案:

答案 0 :(得分:2)

Postgres中的不同函数和运算符使用三种不同模式匹配语言之一,如described in a dedicated section of the manual

您在此处使用的%表单是SQL LIKE语法,其中%代表"任意数量的任何字符"。但是您正在使用的函数regexp_replace需要一个Posix正则表达式,其中等效值为.*.表示任何字符,*表示重复零次或多次)。

另请注意,LIKE表达式必须匹配整个字符串,但Posix正则表达式不会,除非您明确地将字符串的开头与^匹配,并将结尾与{{{ 1}}。

因此$的直接翻译为'%''%',为您提供:

'^.*''.*$'

在实践中,这将产生与更简单的相同的效果:

UPDATE tblName SET colName = regexp_replace(colName, '^.*''.*$', '');

您的实际用例要简单得多:您希望用另一个固定字符串替换所有出现的固定字符串(UPDATE tblName SET colname='' WHERE colname LIKE '%''%'; ,需要引用并转义为')字符串,写'''')。因此,您根本不需要任何模式匹配,只需使用replace直接替换:

''

如果将其限制为包含撇号的行,则可能会更快:

UPDATE tblName SET colname=replace(colname, '''', '');

答案 1 :(得分:0)

%不是正则表达式字符

试试这个

select regexp_replace(colName, $$'$$, '','g') from tblName;

($$用于包围您的字符串而不是'以简化查询) (,'g')用于在找到第一个引号后继续。

 UPDATE tblName SET colName = regexp_replace(colName, $$'$$, '','g');