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

Mysql 使用SQL查询进行多个查找和替换,mysql,sql,sql-update,Mysql,Sql,Sql Update,我想使用SQL查询来查找和替换多个值。我看了一个问题,它给出了以下答案: UPDATE YourTable SET Column1 = REPLACE(Column1,'a','b') WHERE Column1 LIKE '%a%' 如何查找和替换多个值而不是一个值 我的数据如下所示,有数百行,我特别想针对每个产品\u id:123: 订阅id,产品 “128”,“产品id:268 |数量:1 |总计:3.15 |元:|税:0;产品id:267 |数量:1 |总

我想使用SQL查询来查找和替换多个值。我看了一个问题,它给出了以下答案:

UPDATE 
    YourTable
SET 
    Column1 = REPLACE(Column1,'a','b')
WHERE 
    Column1 LIKE '%a%'
如何查找和替换多个值而不是一个值

我的数据如下所示,有数百行,我特别想针对每个
产品\u id:123

订阅id,产品 “128”,“产品id:268 |数量:1 |总计:3.15 |元:|税:0;产品id:267 |数量:1 |总计:2.97 |元:|税:0”

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


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

是的,有很多方法。例如,您可以创建一个表,如

替换(id、旧值、新值)

并执行以下操作:

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是自动递增的)


最简单的方法是将
REPLACE
s链接在一起,但考虑到字段的串联性质,您需要确保您不会无意中针对实际不是
product\u id
值的内容。您可以通过包含字符串值本身的一些上下文内容来缓解此问题:

UPDATE YourTable
    SET products = REPLACE(REPLACE(products, "product_id:267|", "product_id:194|"), "product_id:268|", "product_id:195|");
|



如果这些字符串在给定字段中的显示方式存在一些变化,并且您正在运行MySQL>=8.0,那么您可以利用类似的功能,使用定义的RegExp模式执行相同的替换。

无疑超出了您提出的问题的范围,但您确实需要规范化您的表结构。以这种方式连接数据是不可伸缩/可持续/可靠的。@esqew所有这些数据都将进入导入程序,然后分离出来。。。这很可怕,但这就是它接受数据的方式。您正在运行哪个版本的MySQL?非常感谢。仅就我的理解而言,如果我想添加更多内容,它会是
SET products=REPLACE(REPLACE(产品,“产品id:267”;“产品id:194”;“产品id:268”;“产品id:195”;“产品id:111”;“产品id:222”;)
?不幸的是,不使用此方法,您需要为每个需要替换的值正确地链接一个
REPLACE
,以替换三个必需参数中的每一个;你在评论中看到的不是有效的语法。您需要更类似于
REPLACE(REPLACE(REPLACE(产品),“产品id:267”;“产品id:194”;“产品id:268”;“产品id:195”;“产品id:111”;“产品id:222”;)。一定要回顾一下,这当然是一个解决方案,但我真的认为它并不简单。如果有10000个值,那么在堆栈上放置10000个函数调用。
UPDATE YourTable
    SET products = REPLACE(REPLACE(products, "product_id:267|", "product_id:194|"), "product_id:268|", "product_id:195|");