【问题标题】:Replace special characters in query statement?替换查询语句中的特殊字符?
【发布时间】:2017-05-01 20:40:19
【问题描述】:

我可以使用什么method 去除字符串中的所有特殊字符和空格并在查询中替换为下划线?

例如,我想捕捉以下情况,其中table.field_val = 'ex am.pl/e':

WHERE method(table.field_val) = 'ex_am_pl_e'

【问题讨论】:

    标签: string postgresql replace substring


    【解决方案1】:

    regexp_replace:

    t=# select regexp_replace( 'ex am.pl/e'::text,'[^0-9a-zA-Z]','_','g');
     regexp_replace
    ----------------
     ex_am_pl_e
    (1 row)
    

    或更短的:

    t=# select regexp_replace( 'ex am.pl/e'::text,'[^\w]','_','g');
     regexp_replace
    ----------------
     ex_am_pl_e
    (1 row)
    

    【讨论】:

    • [^\w] 更短
    • @Abelisto 但是[^0-9a-zA-Z][^\w] 并不完全相同。当然,替换字符是_ 但是...
    • op 提供的“特殊字符”列表是空格、点、反斜杠 - 反正我的答案是一个疯狂的猜测
    • @muistooshort 当然可以,但也没有“特殊字符”的定义。
    【解决方案2】:

    使用translate(),例如:

    select translate('ex am.pl/e', ' ./', '___');
    
     translate  
    ------------
     ex_am_pl_e
    (1 row) 
    

    【讨论】:

    • 使用 translate 而不是 regexp_replace 的最佳理由?
    • 速度要快得多。对于更大的数据集很重要。
    • 我似乎无法翻译为多个字符,只有一个。即 `/' 有效,但 ' ./' 无效?编辑:我刚刚意识到这些字符相互对应,这样 translate('string','123','abc');
    • 第三个字符串中的下划线需要与第二个字符串中的不同字符一样多。
    猜你喜欢
    • 2020-06-27
    • 1970-01-01
    • 2015-07-10
    • 2014-11-03
    • 2011-12-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多