MySQL正则表达式匹配

时间:2012-10-17 17:36:30

标签: mysql regex concat

我正在尝试更新我的产品数据库,并在更改某些产品编号后查找重复项。

在过去,更改的项目编号在末尾只有一个额外的短划线和数字或字母,我使用了where where子句:

where a.ProdNum REGEXP CONCAT('^', b.ProdNum, '(\-|\s)[a-zA-Z0-9]+')

现在REGEXP已经超出了我的想象。

旧产品编号:BRB-0325

新产品编号:0325-15(短划线后面的数字可以是任意1位或2位数字)

所以基本上我需要一个where子句,它将从旧数字中删除“BRB-”并在新项目编号后删除任何1或2位数字。

我可以删除“BRB-”,但不知道如何处理1-2位数字,我真的不知道如何同时做两个。

where b.ProdNum = CONCAT('BRB-', c.ProdNum)

以下是我尝试使用2位数而无法正常工作的内容。

where c.ProdNum REGEXP CONCAT('^', b.ProdNum, '(\-)[0-9]{1,2}+')

感谢您的帮助。

3 个答案:

答案 0 :(得分:2)

假设c.ProdNum是新号码,b.ProdNum是旧号码:

WHERE CONCAT('BRB-', c.ProdNum) REGEXP CONCAT('^', b.ProdNum, '-[0-9]{1,2}$')

这会将“BRB-”添加到新号码并将其与旧号码进行比较。因此,您基本上将“BRB-0325-15”与“BRB-0325-nn”进行比较。

答案 1 :(得分:2)

您为什么使用REGEXP?使用简单的比较:

where a.ProdNum like concat(substring(b.ProdNum, 4), '-??')

这将匹配0325-ab,但您肯定没有这样的新产品编号。

答案 2 :(得分:0)

这应该适合你:

SELECT
old.*
FROM
products old,
products new
WHERE new.ProdNum REGEXP CONCAT('^', SUBSTRING(old.ProdNum, 5), '-[0-9]{1,2}$')
AND   old.ProdNum LIKE 'BRB-%'

这应该使用ProdNum上的索引(如果有的话)。