【问题标题】:MySQL Regular Expression MatchMySQL 正则表达式匹配
【发布时间】:2012-10-08 01:13:56
【问题描述】:

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

过去更改的项目编号只是在末尾有一个额外的破折号和数字或字母,我使用了这个 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}+')

感谢您的帮助。

【问题讨论】:

  • 新数字应该从哪里来?
  • 我把它编辑得更清楚了。

标签: mysql regex concat


【解决方案1】:

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

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

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

【讨论】:

  • 这不会使用索引,因为等号左边的CONCAT()函数。
  • @RossSmithII 正则表达式根据定义无论如何都不能使用索引,如果我错了请纠正我?
  • 你是对的!我假设如果正则表达式以^ 开头,MySQL 会使用索引,就像LIKE "a%" 一样。抱歉打扰了!
【解决方案2】:

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

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

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

【讨论】:

  • a 还是 b 是新的项目编号?
【解决方案3】:

这应该适合你:

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 上的索引(如果可用)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-29
    • 1970-01-01
    • 2016-09-24
    • 1970-01-01
    • 2019-03-30
    • 2011-05-01
    相关资源
    最近更新 更多