我正在尝试更新我的产品数据库,并在更改某些产品编号后查找重复项。
在过去,更改的项目编号在末尾只有一个额外的短划线和数字或字母,我使用了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}+')
感谢您的帮助。
答案 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
上的索引(如果有的话)。