背景
合理使用正则匹配可以大幅提升SQL查找的效率
需求
给定数据表regular_demo
,其字段结构如下
DESC regular_demo ;
表内数据如下
select *
from regular_demo
aab | aa | ab |
---|---|---|
1 | 2 | 3 |
4 | 5 | 6 |
- 获取以
aa
开头的字段 - 获取以
ab
开头的字段 - 获取除
ab
开头以外的字段 - 获取除
aa
、aab
开头以外的字段
方法
- 获取以
aa
开头的字段
SQL语句:
SELECT `aa.*`
FROM ytrec_dev.regular_demo
;
执行结果:
aab | aa |
---|---|
1 | 2 |
4 | 5 |
- 获取以
ab
开头的字段
SQL语句:
SELECT `ab.*`
FROM ytrec_dev.regular_demo
;
执行结果:
ab |
---|
3 |
6 |
- 获取除
ab
开头以外的字段
SQL语句:
SELECT `(ab)?+.+`
FROM ytrec_dev.regular_demo
;
执行结果:
aab | aa |
---|---|
1 | 2 |
4 | 5 |
- 获取除
aa
、aab
开头以外的字段
SQL语句:
SELECT `(aab|aa)?+.+` -- 正确写法
FROM ytrec_dev.regular_demo
;
执行结果:
ab |
---|
3 |
6 |
注意这里不能写为
SELECT `(aa|aab)?+.+` -- 错误写法
正确写法中遇到aab时,首先与(aab|ab)中的aab进行匹配,发现可以进行匹配(注意“或”的特性,可以则不继续尝试ab)。由于?+构成占有优先量词,所以不返回匹配结果,继续向下进行匹配。此时aab字段已经没有后续字符,而.+要求至少再出现一个任意字符,因此aab因无法匹配被排除。
而错误写法中遇到aab时,首先与(aa|aab)中的aa进行匹配,发现可以匹配。同样由于?+构成占有优先量词,所以不返回匹配结果,继续向下进行匹配。但此时aab还有一个b没有完成匹配,正好与.*完成匹配,因此无法被过滤