MySQL多LIKE匹配优化:匹配含pp与p且排除特定值的简洁方案
解决方案
方法1:统计字符出现次数
直接统计字符串中p的出现次数,要求至少3次,这样不管p的排列顺序是ppp、pp...p还是p...pp,都能一次性匹配,完全替代繁琐的多OR LIKE条件:
SELECT * FROM `keywords` WHERE LENGTH(keyword) - LENGTH(REPLACE(keyword, 'p', '')) >= 3;
原理是用原字符串长度减去替换掉所有p后的长度,差值就是p的出现次数。比如hippopotamus的p数量是3,满足条件;hippo的p数量是2,被排除,正好符合需求。
方法2:使用正则表达式
如果你的数据库支持正则匹配(比如MySQL的REGEXP、PostgreSQL的~),可以用更灵活的正则表达式来实现:
-- MySQL 示例 SELECT * FROM `keywords` WHERE keyword REGEXP 'p.*p.*p';
这个正则的意思是字符串中至少存在三个p(不管中间间隔什么字符),同样能覆盖你需要的所有LIKE组合场景,写法更简洁。
如果你的需求是必须同时包含连续的pp和单独的p(比如要排除ppp这种三个连续p的情况),可以调整正则为:
SELECT * FROM `keywords` WHERE keyword REGEXP '(pp.*p[^p]|[^p]p.*pp)';
内容的提问来源于stack exchange,提问作者Gixxy22
相关产品推荐
相关产品推荐

