【问题标题】:How to replace multiple characters with a specific character in mysql with regexp_replace?如何用regexp_replace在mysql中用特定字符替换多个字符?
【发布时间】:2020-06-29 13:31:54
【问题描述】:

我正在使用 regexp_replace 将具有某些特殊字符的字符串类型字段替换为“_”,只要这些字符存在。

我正在使用

SELECT regexp_replace('name', ' |\-|\(|\)|\.', '_') from db.table;

Some values from the field 'name':

Pune Municipal Corp - Water
Kerala State Electricity Board Ltd. (KSEBL)
Paschim Gujarat Vij Company Limited (PGVCL)


What I want:

Pune_Municipal_Corp___Water
Kerala_State_Electricity_Board_Ltd___KSEBL_
Paschim_Gujarat_Vij_Company_Limited__PGVCL_

【问题讨论】:

  • 用于函数中的常规替换,因此您只需编写一次
  • 您能否解决问题?如果是这样,请将有帮助的标记为答案。

标签: mysql sql oracle


【解决方案1】:

试试这个

SELECT  regexp_replace(name, '[^a-zA-Z0-9_]', '_') 

db<>fiddle

【讨论】:

    【解决方案2】:

    我不知道您使用的是什么版本的 mysql,但是在 mysql 8+ 上您可以使用本机 REGEXP_REPLACE 函数。

    否则,如果您使用的版本不支持正则表达式替换,您可以创建一个函数来执行此操作。

    功能代码如下:

    
    DELIMITER $$
    
    CREATE FUNCTION  `regex_replace`(pattern VARCHAR(1000),replacement VARCHAR(1000),original VARCHAR(1000))
    RETURNS VARCHAR(1000)
    DETERMINISTIC
    BEGIN 
     DECLARE temp VARCHAR(1000); 
     DECLARE ch VARCHAR(1); 
     DECLARE i INT;
     SET i = 1;
     SET temp = '';
     IF original REGEXP pattern THEN 
      loop_label: LOOP 
       IF i>CHAR_LENGTH(original) THEN
        LEAVE loop_label;  
       END IF;
       SET ch = SUBSTRING(original,i,1);
       IF NOT ch REGEXP pattern THEN
        SET temp = CONCAT(temp,ch);
       ELSE
        SET temp = CONCAT(temp,replacement);
       END IF;
       SET i=i+1;
      END LOOP;
     ELSE
      SET temp = original;
     END IF;
     RETURN temp;
    END$$
    
    DELIMITER ;
    

    使用正则表达式和文本的示例:

    mysql> select regex_replace('[ |\-|\(|\)|\.-]', '_', 'Pune Municipal Corp - Water Kerala State Electricity Board Ltd. (KSEBL) Paschim Gujarat Vij Company Limited (PGVCL)');
    

    我得到了函数here的代码

    希望这会有所帮助!

    【讨论】:

      【解决方案3】:

      您可以简单地使用translatespace- 替换为下划线(_),如下所示:

      Select translate(your_column, ' -', '__') from your_table
      

      Db<>fiddle demo

      【讨论】:

      • 是的,这是为 oracle 准备的。
      猜你喜欢
      • 2021-07-21
      • 1970-01-01
      • 2021-03-31
      • 2018-11-23
      • 2015-09-11
      • 2021-04-07
      • 1970-01-01
      • 2013-12-29
      • 1970-01-01
      相关资源
      最近更新 更多