合理使用正则匹配可以大幅提升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没有完成匹配,正好与.*完成匹配,因此无法被过滤