【问题标题】:Mysql RegExp question selecting from a list of codes从代码列表中选择的 Mysql RegExp 问题
【发布时间】:2011-07-18 02:58:55
【问题描述】:

我正在尝试将摩托车型号列表与一系列 ebay 代码相匹配,以便在 ebay 中列出摩托车。

所以我们得到一个摩托车型号名称,类似于:

制造商是哈雷戴维森的 XL883C Sportster

我有一个类似这样的 ebay 代码列表

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

但是,当我运行查询时,我希望代码匹配 883 的 MB-100-1 或 Sportster 的 MB-100-16,但是当我运行它时,查询返回 MB-100-0 的 Other。

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

非常感谢 格雷厄姆

【问题讨论】:

  • 旁注:如果您的列使用正确的排序规则,LOWER() 应该不是真正必要的。

标签: mysql regex


【解决方案1】:

[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

【讨论】:

  • Richard,我尝试了以下代码因为我试图将其作为函数运行,所以我决定独立运行查询。 SET @fnModel = 'XL883C Sportster';从 tblEbayModelCodes 中选择模型 ID,其中 LOWER(makeName) = 'harley-davidson' 和 @fnModel REGEXP'(Dyna|Electra|FLHR|FLHT|FLSTC|FLSTR|FXCW|FXSTB|Softail|Sportster|Touring|VRSCAW|VRSCD|VRSCR)。 *' 结果集实际上是所有标记为“harley-davidson”的 ebay 代码,因此限制列表仅返回列表中的第一个,因此返回“MB-100-0”,因此它实际上不是与字符串匹配的模式。有什么线索吗?
  • @Graham - 您正在将 REGEXP 与您的 @fnModel 匹配,由于 XL883C Sportster 而匹配?由于它是一个变量,因此它是“所有行”的匹配项,而与记录的 fnModel 列无关。 LIMIT 1 然后取第一个..
  • 嗨,Richard,我明白了,所以在函数中使用时,我想传入一个字符串作为输入参数,我表示为“XL883C Sportster”。然后,我想针对包含所有 ebay 模型 ID 和模型名称的表执行一些模式匹配。它是我要搜索的模型名称字段(抱歉不清楚)。所以我想返回 MB-100-16 modelID 以匹配 modelName 'sportster'。关于如何实现这一点的任何想法?
【解决方案2】:

没有经过全面测试,但应该是这样的:

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'

【讨论】:

  • 嗨,Alvaro,我想我需要更好地解释一下。我希望结果集等于 MB-100-16,因此我需要在输入字符串“XL883C Sportster”中搜索“Sportster”一词。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-18
  • 2012-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多