SQL中的正则使用

背景

合理使用正则匹配可以大幅提升SQL查找的效率


需求

给定数据表regular_demo,其字段结构如下

DESC regular_demo ;

在这里插入图片描述
表内数据如下

select 	*
from	regular_demo
aabaaab
123
456
  1. 获取以aa开头的字段
  2. 获取以ab开头的字段
  3. 获取除ab开头以外的字段
  4. 获取除aaaab开头以外的字段

方法

  1. 获取以aa开头的字段

SQL语句:

SELECT `aa.*`
FROM ytrec_dev.regular_demo
;

执行结果:

aabaa
12
45
  1. 获取以ab开头的字段

SQL语句:

SELECT `ab.*`
FROM ytrec_dev.regular_demo
;

执行结果:

ab
3
6
  1. 获取除ab开头以外的字段

SQL语句:

SELECT `(ab)?+.+`
FROM ytrec_dev.regular_demo
;

执行结果:

aabaa
12
45
  1. 获取除aaaab开头以外的字段

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没有完成匹配,正好与.*完成匹配,因此无法被过滤

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值