MySQL学习笔记:利用正则表达式实现多个字段模糊查询
在 Oracle 中实现了多字段模糊匹配后,MySQL 也学习一番。找到一篇文章,记录一番,不一一尝试。
现在有这么一个需求:一个questions表,字段有题目(TestSubject),选项(AnswerA,AnswerB,AnswerC,AnswerD,AnswerE) 要求字段不包含png,jpg,jpeg,gif,正常情况下会这么写:
select * from questions
where TestSubject not like '%png%'
or TestSubject not like '%png%' or
......
总共需要写6 * 4 = 24个。
第一步优化,将字段拼接起来当做一个字段。
select * from questions
where concat(TestSubject,AnswerA,AnswerB,AnswerC,AnswerD,AnswerE) not like '%png%'
or concat(TestSubject,AnswerA,AnswerB,AnswerC,AnswerD,AnswerE) not like '%jpg%'
......
总共需要重复写四遍。
第二步优化,使用正则表达式,结合 regexp 进行查询。
select * from questions
where concat(TestSubject,AnswerA,AnswerB,AnswerC,AnswerD,AnswerE) not regexp 'png|jpg|jpeg|gif';
一步到位。
正则表达式
- ^ -- 匹配字符串的开始位置
- $ -- 匹配字符串的结尾位置
- . -- 任何单个字符
- [...] -- 字符集合
- [^...] -- 匹配未包含的任意字符
- p1|p2|p3 -- 字符 或
- 星号(*) -- 0个或多个字符
- 加号(+) -- 1个或多个字符
- {n} -- n次
- {n,m} -- 最小n次,最多m次
其他
SQL 默认是忽略大小写的。
在 MySQL 中,正则模式使用 regexp 和 not regexp 操作符(或者 rlike 和 not rlike,它们是同义词)。
where name regexp '[a-z]' -- 包含a到z某个字符的字符串
where name regexp '^n.....b$' -- 以n开头b结尾,7个字符长度的字符串
where name rlike 'd*' -- 包含0个或多个d的字符串
where name rlike 'B{1}$' -- 以1个B结尾
where name rlike 'b|a' -- 包含b或者a字符
MySQL 的 like 语句中的通配符:百分号、下划线和escape
- 百分号:表示任意1个或多个任意字符。可匹配任意类型和长度的字符。
- 下划线:表示任意单个字符。匹配单个任意字符,它常用来限制表达式的字符长度语句(可以代表一个中文字符)。
- escape:转义字符,后面的 % 和 _ 不作为通配符。
分类:
MySQL
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)