Mysql RegExp从代码列表中选择问题

时间:2011-03-18 12:00:02

标签: mysql regex

我正在尝试将一系列摩托车模型与一系列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>

我猜我的模式不正确,所以有人可以建议我可能需要做些什么来纠正这个问题吗?

非常感谢 格雷厄姆

2 个答案:

答案 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'