Paul Dixon 的回答对我来说非常有用。除此之外,对于那些对使用 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';
用途:
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 替代方案:
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';
请注意,我将 NOT 集分隔在单独的 WHERE 过滤器中。我尝试使用否定模式、前瞻性模式等。然而,这些表达式似乎并没有产生预期的结果。在上面的第一个示例中,我使用 ^9999$ 来表示完全匹配。这允许您在同一表达式中添加具有通配符匹配的特定匹配。但是,您也可以混合使用这些类型的语句,如列出的第二个示例所示。
关于性能,我对现有表进行了一些小测试,发现我的变体之间没有差异。但是,我认为更大的数据库、更大的字段、更多的记录数和更复杂的过滤器可能会导致性能问题。
和往常一样,使用上面的逻辑,因为它是有意义的。
如果你想了解更多关于正则表达式的知识,我推荐 www.regular-expressions.info 作为一个很好的参考网站。