【问题标题】:replace regex does not work in postgresql替换正则表达式在 postgresql 中不起作用
【发布时间】:2017-01-31 22:40:11
【问题描述】:

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

"''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, '%''%', '');

【问题讨论】:

    标签: regex postgresql sql-update


    【解决方案1】:

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

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

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

    所以'%''%' 的直接翻译是'^.*''.*$',给你这个:

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

    实际上,这将产生与更简单的效果相同的效果:

    UPDATE tblName SET colname='' WHERE colname LIKE '%''%';
    

    您的实际用例要简单得多:您想用另一个固定字符串(空字符串,写为@ 987654339@)。所以你根本不需要任何模式匹配,只需使用replace 直接替换即可:

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

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

    UPDATE tblName SET colname=replace(colname, '''', '') WHERE colname LIKE '%''%';
    

    【讨论】:

    • 这个删除了值,但我只想删除单引号!
    • @Raha1986 我已经根据您的说明更新了答案,请阅读到最后。
    • 这很有趣!相同的查询不适用于“(”。我认为它应该与单引号相同!
    • 你能告诉我同样的查询不应该适用于“(”或“)”
    • 如果没有看到您正在尝试的确切内容,我无法告诉您,但 UPDATE tblName SET colname=replace(colname, '(', '') WHERE colname LIKE '%(%'; 应该可以正常工作。也许你只是在某个地方犯了错误。
    【解决方案2】:

    % 不是正则表达式字符

    试试这个

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

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

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

    【讨论】:

    • Baron 查询有问题,在第一个引号之后,它使查询的其余部分变为紫色
    • 还是执行吧,编辑器不认$$但postgresql server 认,只是显示问题。如果你愿意,你可以使用 regexp_replace(colName, '''', '','g') 但它不是很可读
    • 我只想删除单引号而不是删除整个值!
    • 我认为可读性是一个品味问题。在这样的短字符串上,我发现$$'$$'''' 更难阅读,而且它在其他 DBMS 中具有相同的优势。
    • @RémyBaron 说真的,它是很多客户显示函数时使用的,人类常用的写作 函数;在 DB 内部,定义是一个字符串值,就像任何其他值一样,不需要引用或转义。但绝对是,在这种情况下,美元报价绝对是天赐之物。我倾向于将其视为 Postgres 的“heredoc”等价物,并在类似情况下使用它。不过,我绝对永远不会使用它来防御注入;这只是通过默默无闻的安全性,因为注入$ 可能并不比' 更难。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-13
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 2011-09-07
    • 2013-11-03
    相关资源
    最近更新 更多