使用 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 模式进行相同的替换。
我想使用 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 模式进行相同的替换。