我有一个带有字符串列的表。字符串中有一个单引号,我想去掉所有的单引号。例如:
"''hey, hey, we're the monkees''"
我的regex工作得很好,可以选择所有包含单引号的值。
select regexp_replace(colName, '%''%', '') from tblName;
但是当我想什么都不替换这个正则表达式时,它不会更新我的表。
UPDATE tblName SET colName = regexp_replace(colName, '%''%', '');
我也检查了这个
UPDATE tblName SET colName = replace(colName, '%''%', '');
Postgres中的不同函数和运算符使用三种不同的模式匹配语言中的一种,如手册的专用部分所述。
这里使用的%
形式是SQLLIKE
语法,其中%
表示"任何字符的任何数字"。但是您正在使用的函数regexp_replace
需要一个Posix正则表达式,其中等效的是.*
(.
表示任何字符,*
表示重复零次或多次)。
还要注意,LIKE
表达式必须匹配整个字符串,但Posix正则表达式不匹配,除非您将字符串的开头与^
显式匹配,将字符串的结尾与$
显式匹配。
所以'%''%'
的直接翻译应该是'^.*''.*$'
,给你这个:
UPDATE tblName SET colName = regexp_replace(colName, '^.*''.*$', '');
在实践中,这将产生与更简单的相同的效果:
UPDATE tblName SET colname='' WHERE colname LIKE '%''%';
您的实际用例要简单得多:您希望用另一个固定字符串(空字符串,写为''
)替换所有出现的固定字符串('
,需要引用并转义为''''
)。因此,您根本不需要任何模式匹配,只需使用replace
:直接替换即可
UPDATE tblName SET colname=replace(colname, '''', '');
如果您将其限制为以开头的包含撇号的行,这可能会更快
UPDATE tblName SET colname=replace(colname, '''', '') WHERE colname LIKE '%''%';
%不是正则表达式字符
试试这个
select regexp_replace(colName, $$'$$, '','g') from tblName;
($$用于环绕字符串,而不是'以简化查询)(,'g')用于在找到第一个引号后继续。
UPDATE tblName SET colName = regexp_replace(colName, $$'$$, '','g');