MySQL正则表达式替换查询

时间:2015-04-17 13:37:13

标签: mysql

我有一个具有此值的字段:

TEST:ATEST:TESTA

我想替换" TEST"使用" NEW",我尝试了此查询:

UPDATE `table` SET `field` = REPLACE(`field`, 'TEST', 'NEW') WHERE `field` REGEXP 'TEST';

结果是:

NEW:ANEW:NEWA

问:我怎样才能进行替换查询,结果如下:

NEW:ATEST:TESTA

2 个答案:

答案 0 :(得分:0)

这有点痛苦,但你可以这样做:

UPDATE `table`
    SET field = substr(REPLACE(concat(':', field, ':'), ':TEST:', ':NEW:'),
                       2, length(REPLACE(concat(':', field, ':'), ':TEST:', ':NEW:')) - 2)
    WHERE concat(':', field, ':') LIKE '%:TEST:%';

我更喜欢LIKEREGEXP,因为希望能够使用索引。在这种情况下,这不可能,但有希望。

这是在开头和结尾用冒号分隔值,并且只替换完全分隔的值。诀窍是然后删除额外的冒号。

答案 1 :(得分:0)

您可以尝试http://sqlfiddle.com/#!9/4e66b/3

所以更新查询是(如果表名= table1,字段名= field1,并且有唯一列ID):

UPDATE `table1` 
INNER JOIN
  (SELECT id, 
    @set_idx:=FIND_IN_SET('TEST',REPLACE(field1,':',',')),
    @set_size:=LENGTH(field1)-LENGTH(REPLACE(field1,':',''))+1,
    CASE 
      WHEN @set_idx=1 THEN CONCAT('NEW',SUBSTRING(field1, 4))
      WHEN @set_idx>1 THEN CONCAT(SUBSTRING_INDEX(field1, ':',@set_idx-1),':NEW', IF(@set_size>@set_idx,CONCAT(':',SUBSTRING_INDEX(field1, ':',-(@set_size-@set_idx))),''))
    END as new
  FROM table1
  WHERE `field1` REGEXP '(^TEST$)|(^TEST:)|(:TEST$)|(:TEST:)'
   ) t
ON t.id = table1.id
SET table1.field1 = t.new;