我有一個字段與此值:MySQL的正則表達式替換查詢
TEST:ATEST:TESTA
而且我想用「新」來代替「TEST」,我曾嘗試此查詢:
UPDATE `table` SET `field` = REPLACE(`field`, 'TEST', 'NEW') WHERE `field` REGEXP 'TEST';
結果是:
NEW:ANEW:NEWA
問:我怎麼能這樣做替換查詢所以結果會是這樣:
NEW:ATEST:TESTA
我有一個字段與此值:MySQL的正則表達式替換查詢
TEST:ATEST:TESTA
而且我想用「新」來代替「TEST」,我曾嘗試此查詢:
UPDATE `table` SET `field` = REPLACE(`field`, 'TEST', 'NEW') WHERE `field` REGEXP 'TEST';
結果是:
NEW:ANEW:NEWA
問:我怎麼能這樣做替換查詢所以結果會是這樣:
NEW:ATEST:TESTA
這是一個有點痛,但你可以這樣來做:
UPDATE `table`
SET field = substr(REPLACE(concat(':', field, ':'), ':TEST:', ':NEW:'),
2, length(REPLACE(concat(':', field, ':'), ':TEST:', ':NEW:')) - 2)
WHERE concat(':', field, ':') LIKE '%:TEST:%';
我喜歡LIKE
到REGEXP
,因爲有一種能夠使用索引的希望。在這種情況下,這不是一種可能性,但有希望。
這是用開頭和結尾的冒號分隔值,並且只替換完全分隔的值。訣竅是然後刪除額外的冒號。
它的工作原理。謝謝! – iTesTi
您可以嘗試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;
所以文'TEST'可能出現在任何地方或只是在第一個地方? –
請考慮以下解決方案在這裏: http://stackoverflow.com/questions/986826/how-to-do-a-regular-expression-replace-in-mysql – Andriy
良好的漁獲@Abhikda,+1,所以如果TEST出現在第一位,我們可以使用「^」來匹配開頭 –