保罗·迪克森(Paul Dixon)的回答对我来说非常出色。除此之外,对于那些对使用REGEXP感兴趣的人,我观察到了一些东西:
要使用通配符完成多个LIKE过滤器:
SELECT * FROM fiberbox WHERE field LIKE '%1740 %'
OR field LIKE '%1938 %'
OR field LIKE '%1940 %';
使用REGEXP Alternative:
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';
用:
SELECT * FROM fiberbox WHERE field REGEXP '^1740 |1938 $|1940 (.*) test';
有更有效的方法来缩小特定的匹配范围,但这需要对正则表达式进行更多的检查。注意:并非所有的正则表达式模式都可以在MySQL语句中使用。您需要测试您的模式并查看有效的方法。
最后,要实现多个LIKE和NOT LIKE过滤器:
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 Alternative:
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作为一个很好的参考站点。
WHERE FIND_IN_SET(f.fiberbox, "1740,1938,1940")