使用 SQL 查询进行多次查找和替换

Multiple find and replace using SQL query

我想使用 SQL 查询来查找和替换多个值。我看过 this 显示以下答案的问题:

UPDATE 
    YourTable
SET 
    Column1 = REPLACE(Column1,'a','b')
WHERE 
    Column1 LIKE '%a%'

如何查找和替换多个值,而不仅仅是一个值?

我的数据如下,有数百行,我特别想针对每个 product_id:123:

subscription_id,products "128","product_id:268|quantity:1|total:3.15|meta:|tax:0;product_id:267|quantity:1|total:2.97|meta:|tax:0"

我需要用新产品 ID 替换产品 ID。所以它将是“所有匹配 268 的都将变为 195”和“所有匹配 267 的都将变为 194”。

除了采用上面的代码块并将其用于每个产品之外,还有其他有效的方法吗?我可以扫一扫吗?

是的,有办法。例如,您可以创建一个 table like

替换(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'),
...
;

最简单的方法是将 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.8 REPLACE Statement


如果这些字符串在给定字段中的显示方式存在一些差异,并且您 运行 MySQL >=8.0,您可以利用 REGEXP_REPLACE() 之类的东西来执行此操作使用定义的 RegExp 模式进行相同的替换。