我正在尝试将一系列摩托车模型与一系列ebay代码相匹配,以便在ebay上列出摩托车。
所以我们得到的摩托车模型名称将是:
XL883C Sportster,制造商是Harley Davidson
我有一个看起来像这样的易趣代码列表
MB-100-0 Other
MB-100-1 883
MB-100-2 1000
MB-100-3 1130
MB-100-4 1200
MB-100-5 1340
MB-100-6 1450
MB-100-7 Dyna
MB-100-8 Electra
MB-100-9 FLHR
MB-100-10 FLHT
MB-100-11 FLSTC
MB-100-12 FLSTR
MB-100-13 FXCW
MB-100-14 FXSTB
MB-100-15 Softail
MB-100-16 Sportster
MB-100-17 Touring
MB-100-18 VRSCAW
MB-100-19 VRSCD
MB-100-20 VRSCR
所以我想使用regExp模式将模型名称与上面的列表匹配。
我尝试过以下代码:
SELECT modelID FROM tblEbayModelCodes WHERE
LOWER(makeName) = 'harley-davidson' AND fnmodel REGEXP '[883|1000|1130|1200|1340|1450|Dyna|Electra|FLHR|FLHT|FLSTC|FLSTR|FXCW|FXSTB|Softail|Sportster|Touring|VRSCAW|VRSCD|VRSCR].*' LIMIT 1
然而,当我运行查询时,我希望代码匹配MB-100-1 for 883或MB-100-16 for Sportster但是当我运行它时,查询返回MB-100-0 for Other。 / p>
我猜我的模式不正确,所以有人可以建议我可能需要做些什么来纠正这个问题吗?
非常感谢 格雷厄姆
答案 0 :(得分:0)
[chars]匹配任何字符'c','h','a','r','s'
所以通过给它这么长的列表,它将不可避免地匹配第一个项目(单个字符)
试试这个
LOWER(makeName) = 'harley-davidson' AND fnmodel REGEXP '(883|1000|1130|1200|1340|1450|Dyna|Electra|FLHR|FLHT|FLSTC|FLSTR|FXCW|FXSTB|Softail|Sportster|Touring|VRSCAW|VRSCD|VRSCR).*' LIMIT 1
您也可以考虑不使用REGEX并使用FIND_IN_SET代替。
答案 1 :(得分:0)
尚未经过全面测试,但它应该是这样的:
REGEXP '^MB-[0-9]+-[0-9]+[[:space:]]+(883|1000|1130|1200|1340|1450|Dyna|Electra|FLHR|FLHT|FLSTC|FLSTR|FXCW|FXSTB|Softail|Sportster|Touring|VRSCAW|VRSCD|VRSCR)$'
详细说明:
^MB- Starts with MB-
[0-9]+ One or more digits
- Dash
[0-9]+ One or more digits
[[:space:]]+ One or more white space
(883|1000|...)$ Ends with one of these
以下是MySQL所说的正则表达方言的参考资料:
http://dev.mysql.com/doc/refman/5.1/en/regexp.html
回答评论:
如果您想匹配 Sportster 行,则删除所有其他条件。你甚至可能不需要正则表达式:
WHERE fnmodel LIKE '% Sportster'