2015-04-17 37 views
0

我有一個字段與此值:MySQL的正則表達式替換查詢

TEST:ATEST:TESTA 

而且我想用「新」來代替「TEST」,我曾嘗試此查詢:

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

結果是:

NEW:ANEW:NEWA 

問:我怎麼能這樣做替換查詢所以結果會是這樣:

NEW:ATEST:TESTA 
+1

所以文'TEST'可能出現在任何地方或只是在第一個地方? –

+0

請考慮以下解決方案在這裏: http://stackoverflow.com/questions/986826/how-to-do-a-regular-expression-replace-in-mysql – Andriy

+0

良好的漁獲@Abhikda,+1,所以如果TEST出現在第一位,我們可以使用「^」來匹配開頭 –

回答

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,因爲有一種能夠使用索引的希望。在這種情況下,這不是一種可能性,但有希望。

這是用開頭和結尾的冒號分隔值,並且只替換完全分隔的值。訣竅是然後刪除額外的冒號。

+0

它的工作原理。謝謝! – iTesTi

0

您可以嘗試http://sqlfiddle.com/#!9/4e66b/3

所以更新查詢(如表名=表1,字段名=字段1,並有獨特的列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, ':',-(@[email protected]_idx))),'')) 
    END as new 
    FROM table1 
    WHERE `field1` REGEXP '(^TEST$)|(^TEST:)|(:TEST$)|(:TEST:)' 
    ) t 
ON t.id = table1.id 
SET table1.field1 = t.new;