【问题标题】:How to replace a regex pattern in MySQL如何在 MySQL 中替换正则表达式模式
【发布时间】:2020-03-06 06:54:44
【问题描述】:

我有一个名为myTable 的表,其中有一列名为col1。此列包含以下格式的数据:(1 或 2 位)(连字符)(8 位)。

我想替换此列中的所有数据,并将连字符之前的所有内容替换为 4,所以这是一个示例:

--------------------------------
|  old values   |  New Values  |
--------------------------------
| 1-654283568  =>  4-654283568 |
| 2-467862833  =>  4-467862833 |
| 8-478934293  =>  4-478934293 |
| 12-573789475 =>  4-573789475 |
| 16-574738575 =>  4-574738575 |
--------------------------------

我使用的是 MySQL 5.7.19,我相信 REGEXP_REPLACE 在 MySQL 版本 8+ 中可用...不确定如何实现?

【问题讨论】:

  • 到目前为止你尝试过什么?你被困在哪里了?

标签: mysql sql mysql-5.7


【解决方案1】:

你不需要正则表达式;您可以使用SUBSTRING_INDEX 提取连字符后的所有内容并将4- 连接到该内容:

UPDATE myTable
SET col1 = CONCAT('4-', SUBSTRING_INDEX(col1, '-', -1))

Demo on dbfiddle

无论连字符后的字符数如何,这都将起作用。

【讨论】:

  • 为了公平对待回答了这个原始问题的@scaisEdge,您可能应该将他们的答案保留为已接受的答案。
【解决方案2】:

看看你的模式似乎你可以避免正则表达式

update myTable  
set col1  = concat('4-', right(col1,8))

update myTable  
set col1  = concat('4', right(col1,9))

【讨论】:

    【解决方案3】:

    试试这个:

    UPDATE testing SET val=REPLACE(val,SUBSTRING(val,1,LOCATE('-',val)),'4-');
    

    在这里拉小提琴:https://www.db-fiddle.com/f/4mU5ctLh8NB9iKSKZF9Ue2/2

    使用LOCATE 查找'-' 位置,然后使用SUBSTRING 仅获取'-' 的前部。

    【讨论】:

      【解决方案4】:
      SELECT CONCAT( @new_prefix, SUBSTRING(old_value FROM LOCATE('-', old_value)) ) AS new_value
      

      UPDATE sourcetable
      SET fieldname = CONCAT( '4', SUBSTRING(fieldname FROM LOCATE('-', fieldname)) )
      WHERE LOCATE('-', fieldname)
      /* AND another conditions */
      

      【讨论】:

      • @HoomanBahreini 但是这里没有定义@new_prefix... ???您说过“我想替换此列中的所有数据并将连字符之前的所有内容替换为 4”,所以@new_prefix := '4'
      • @HoomanBahreini UPDATE 已添加查询。不包含破折号的记录将不会被更新。
      猜你喜欢
      • 2012-02-12
      • 1970-01-01
      • 2011-03-29
      • 2011-03-10
      • 2016-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-02
      相关资源
      最近更新 更多