我有一个包含字符串列的表。在字符串中有单引号,我想摆脱所有单引号。例如:
"''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, '%''%', '');
答案 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');