我想使用SQL查询来查找和替换多个值。我看了一下这个问题,答案如下:
UPDATE
YourTable
SET
Column1 = REPLACE(Column1,'a','b')
WHERE
Column1 LIKE '%a%'
我如何找到并替换多个值,而不仅仅是一个?
我的数据如下,有数百行,我特别想针对每个product_id:123
:
subscription_id,产品"128","product_id: 268 |数量:1 |总:3.15元:| |税:0;product_id: 267 |数量:1 |总:2.97元:| |税:0">
我需要用新产品id替换产品id。所有与268匹配的都变成了195所有与267匹配的都将变成194。
除了上面的代码块并对每个产品使用它之外,还有其他有效的方法吗?我能扫一遍吗?
最简单的可能方法是将REPLACE
链在一起,但考虑到字段的连接性质,您需要确保不会无意中瞄准实际上不是product_id
值的东西。您可以通过从字符串值本身包含一些上下文内容来缓解这种情况:
UPDATE YourTable
SET products = REPLACE(REPLACE(products, "product_id:267|", "product_id:194|"), "product_id:268|", "product_id:195|");
DBFiddle | MySQL 5.6 Reference Manual:: 13.2.8REPLACE
Statement
如果在给定字段中这些字符串可能出现的方式有一些可变性,并且您正在运行MySQL>=8.0,您可以利用REGEXP_REPLACE()
之类的东西来使用定义的RegExp模式执行相同的替换。
是的,有很多方法。例如,您可以创建一个像
这样的表替换(id, oldval, newval)
并执行以下操作:
UPDATE
Yourtable
JOIN
replacements
ON
Yourtable.Column1 LIKE CONCAT('%', replacements.oldval, '%')
SET
Yourtable.Column1 = REPLACE(Yourtable.Column1, replacements.oldval, replacements.newval);
问题是您需要用oldval-newval对填充替换,但是MySQL无法猜到。插入与
一样简单(假设id为auto_increment)。INSERT INTO replacements(oldval, newval) VALUES
('a', 'b'),
('c', 'd'),
...
;