• SQL中的正则使用


    背景

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


    需求

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

    DESC regular_demo ;
    
    • 1

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

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

    方法

    1. 获取以aa开头的字段

    SQL语句:

    SELECT `aa.*`
    FROM ytrec_dev.regular_demo
    ;
    
    • 1
    • 2
    • 3

    执行结果:

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

    SQL语句:

    SELECT `ab.*`
    FROM ytrec_dev.regular_demo
    ;
    
    • 1
    • 2
    • 3

    执行结果:

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

    SQL语句:

    SELECT `(ab)?+.+`
    FROM ytrec_dev.regular_demo
    ;
    
    • 1
    • 2
    • 3

    执行结果:

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

    SQL语句:

    SELECT `(aab|aa)?+.+` -- 正确写法
    FROM ytrec_dev.regular_demo
    ;
    
    • 1
    • 2
    • 3

    执行结果:

    ab
    3
    6

    注意这里不能写为

    SELECT `(aa|aab)?+.+`  -- 错误写法
    
    • 1

    正确写法中遇到aab时,首先与(aab|ab)中的aab进行匹配,发现可以进行匹配(注意“或”的特性,可以则不继续尝试ab)。由于?+构成占有优先量词,所以不返回匹配结果,继续向下进行匹配。此时aab字段已经没有后续字符,而.+要求至少再出现一个任意字符,因此aab因无法匹配被排除。
    而错误写法中遇到aab时,首先与(aa|aab)中的aa进行匹配,发现可以匹配。同样由于?+构成占有优先量词,所以不返回匹配结果,继续向下进行匹配。但此时aab还有一个b没有完成匹配,正好与.*完成匹配,因此无法被过滤

  • 相关阅读:
    Matlab如何导入Excel数据并进行FFT变换
    Java 线程安全(二)-- synchronized
    『Linux小程序』进度条
    flutter开发的一个小小小问题,内网依赖下不来
    【Spring高级】第3讲 Bean的生命周期
    《七月集训》第二十二日——有序集合
    Git学习笔记
    ARM体系架构
    自学软件测试,学到什么程度可以出去找工作啊?
    IO多路转接
  • 原文地址:https://blog.csdn.net/jh_210/article/details/126389010