我有一个具有此值的字段:
TEST:ATEST:TESTA
我想替换" TEST"使用" NEW",我尝试了此查询:
UPDATE `table` SET `field` = REPLACE(`field`, 'TEST', 'NEW') WHERE `field` REGEXP 'TEST';
结果是:
NEW:ANEW:NEWA
问:我怎样才能进行替换查询,结果如下:
NEW:ATEST:TESTA
答案 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:%';
我更喜欢LIKE
到REGEXP
,因为希望能够使用索引。在这种情况下,这不可能,但有希望。
这是在开头和结尾用冒号分隔值,并且只替换完全分隔的值。诀窍是然后删除额外的冒号。
答案 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;