保罗·迪克森的回答对我非常有效。为了补充这一点,以下是我观察到的对使用REGEXP感兴趣的一些事情:
使用通配符完成多个LIKE过滤器:
SELECT * FROM fiberbox WHERE field LIKE '%1740 %'
OR field LIKE '%1938 %'
OR field LIKE '%1940 %';
使用REGEXP替代方案:
SELECT * FROM fiberbox WHERE field REGEXP '1740 |1938 |1940 ';
REGEXP引号内和| (OR)操作符之间的值被视为通配符。通常,REGEXP需要通配符表达式(.*)1740(.*)作为%1740 %。
如果你需要更多的控制通配符的位置,可以使用这些变量:
使用受控通配符放置实现LIKE:
SELECT * FROM fiberbox WHERE field LIKE '1740 %'
OR field LIKE '%1938 '
OR field LIKE '%1940 % test';
Use:
SELECT * FROM fiberbox WHERE field REGEXP '^1740 |1938 $|1940 (.*) test';
将^放在值的前面表示行开始。
在值之后放置$表示行结束。
放置(.*)的行为很像%通配符。
的。表示除换行符以外的任何单个字符。放置。
带有*(.*)的Inside()添加了一个重复的模式,表示任何数字
直到行尾。
有更有效的方法来缩小特定的匹配,但这需要对正则表达式进行更多的复习。注意:并不是所有的正则表达式模式都适用于MySQL语句。您需要测试您的模式,看看哪些是有效的。
最后,要完成多个喜欢和不喜欢过滤器:
SELECT * FROM fiberbox WHERE field LIKE '%1740 %'
OR field LIKE '%1938 %'
OR field NOT LIKE '%1940 %'
OR field NOT LIKE 'test %'
OR field = '9999';
使用REGEXP替代方案:
SELECT * FROM fiberbox WHERE field REGEXP '1740 |1938 |^9999$'
OR field NOT REGEXP '1940 |^test ';
或混合选择:
SELECT * FROM fiberbox WHERE field REGEXP '1740 |1938 '
OR field NOT REGEXP '1940 |^test '
OR field NOT LIKE 'test %'
OR field = '9999';
注意,我在一个单独的WHERE过滤器中分离了NOT集。我尝试使用否定模式、向前看模式等等。然而,这些表达似乎没有产生预期的结果。在上面的第一个例子中,我使用^9999$来表示精确匹配。这允许您在同一个表达式中添加带有通配符匹配的特定匹配。但是,您也可以混合使用这些类型的语句,就像您在列出的第二个示例中看到的那样。
关于性能,我针对一个现有的表运行了一些小测试,发现我的变体之间没有差异。但是,我认为,对于更大的数据库、更大的字段、更大的记录计数和更复杂的过滤器,性能可能会成为一个问题。
像往常一样,使用上面的逻辑,因为它是有意义的。
如果你想了解更多关于正则表达式的知识,我推荐www.regular-expressions.info作为一个很好的参考网站。