当前位置: 首页 > news >正文

oracle中sql 正则怎么写?

文章目录

    • 在Oracle 10g及以下版本中,可以使用POSIX扩展来进行正则匹配
    • Oracle 11g及以上版本
    • 是否走索引

Oracle中使用正则表达式需先使用REGEXP_LIKE函数来匹配字符串。正则表达式的语法与一般正则表达式相似,但具体的写法也受不同版本的Oracle环境不同。

在Oracle 10g及以下版本中,可以使用POSIX扩展来进行正则匹配

如:

^:匹配字符串的开始位置;
$:匹配字符串的结束位置;
.:匹配任何单个字符;
[ ]:匹配指定集合内的任何字符,如[abc]匹配a、b、c中任意一个字符;
[^ ]:匹配不在指定集合内的任何字符,如[^abc]匹配除a、b、c之外的任意字符;
*:匹配前面的子表达式零次或多次;
+:匹配前面的子表达式一次或多次;
?:匹配前面的子表达式零次或一次;
{n}:n为非负整数,匹配恰好n次;
{n,}:n为非负整数,匹配至少n次;
{n,m}:n和m为非负整数且n<=m,匹配至少n次且至多m次。
例如,可以使用REGEXP_LIKE函数配合正则表达式来查找符合条件的字符串:

SELECT *
FROM employees
WHERE REGEXP_LIKE(job_title, '^Sales.*Manager$');

上述SQL查询会查找职位名称以“Sales”开头,且以“Manager”结尾的所有员工数据。

Oracle 11g及以上版本

对于Oracle 11g及以上版本,可以使用更强大的Perl兼容正则表达式(PCRE)来进行匹配
在使用PCRE时,先需要使用REGEXP_REPLACE函数中加入’c’选项进行匹配,然后再使用相应的正则表达式来实现匹配。

例如,可以使用如下的SQL查询来查找所有包含“John”或“Johnson”的名称:

SELECT *
FROM employees
WHERE REGEXP_REPLACE(name, '(John|Johnson)', '*', 1, 0, 'c') != name;

我的实际例子:

SELECT *
--DISTINCT CODE,count(1)
FROM table
WHERE 1 = 1
AND DATA_CATE = 'CPAU'
--AND ext_5 LIKE 'ASSM%'
AND REGEXP_REPLACE(ext_5, '(ASSM01|PSVA0100)', '*', 1, 0, 'c') != ext_5;
AND VALID_FLG = 'Y'

是否走索引

正则表达式的匹配通常需要对目标字符串全文扫描,因此,在大多数情况下,使用正则表达式无法利用数据库索引。也就是说,在使用正则表达式时,往往无法使用索引来优化查询。

例如,假设有一个包含文本的表,其中有一个 text 字段,我们希望查找所有包含“abc”字符的记录。如果使用 LIKE 操作符,可以这样写:

SELECT * FROM table WHERE text LIKE ‘%abc%’;
如果 text 字段上有索引,那么这个查询会利用索引优化执行,因为 LIKE 操作符可以使用前缀索引。但是,如果使用正则表达式,查询语句将变为:

SELECT * FROM table WHERE REGEXP_LIKE(text, ‘abc’);
在这种情况下,不能使用索引来优化查询,因为 REGEXP_LIKE 函数需要全文扫描才能找到匹配的记录。

虽然正则表达式在某些情况下可能无法使用索引优化,但是可以尽可能地使用模糊查询来代替正则表达式,从而使用索引来优化查询。例如,在上面的例子中,可以使用 LIKE 操作符而不是 REGEXP_LIKE 函数来查询相同的数据。虽然 LIKE 操作符不能使用正则表达式语法,但是它可以使用前缀索引进行优化,可以在满足需求的情况下提高性能。

相关文章:

  • 【5G RRC】NR测量Gap介绍
  • 【T+】登录畅捷通T+软件后提示同一个浏览器中不允许存在用户XX同时在线。
  • pom文件详解
  • JVM 类加载器子系统
  • 半小时内实现Esp32-Cam模型训练和图像识别
  • 关于一个大学生写一个题目写一天
  • 【C#进阶】C# 多线程
  • mlq移动最小二乘方法
  • 【Spring6】| Spring IoC注解式开发
  • 数据库+加密算法参考材料-2023.3.29
  • fastp软件介绍
  • 别再光靠工资过日子,外国程序员教你如何通过副业赚钱
  • 海心沙元宇宙音乐会虚拟主持人玩法再升级,虚拟动力技术全程助力
  • spark通过connector的方式读写starrocks
  • python实战应用讲解-【numpy专题篇】实用小技巧(六)(附python示例代码)
  • ----------
  • [Vue CLI 3] 配置解析之 css.extract
  • [分享]iOS开发-关于在xcode中引用文件夹右边出现问号的解决办法
  • 《Java8实战》-第四章读书笔记(引入流Stream)
  • Android路由框架AnnoRouter:使用Java接口来定义路由跳转
  • docker python 配置
  • Intervention/image 图片处理扩展包的安装和使用
  • Java 9 被无情抛弃,Java 8 直接升级到 Java 10!!
  • JavaSE小实践1:Java爬取斗图网站的所有表情包
  • Js基础——数据类型之Null和Undefined
  • Koa2 之文件上传下载
  • mysql 5.6 原生Online DDL解析
  • MySQL QA
  • opencv python Meanshift 和 Camshift
  • Python - 闭包Closure
  • 欢迎参加第二届中国游戏开发者大会
  • 机器学习中为什么要做归一化normalization
  • 利用阿里云 OSS 搭建私有 Docker 仓库
  • 码农张的Bug人生 - 初来乍到
  • 模仿 Go Sort 排序接口实现的自定义排序
  • 微信开源mars源码分析1—上层samples分析
  • 协程
  • 智能合约开发环境搭建及Hello World合约
  • 正则表达式-基础知识Review
  • ​LeetCode解法汇总1276. 不浪费原料的汉堡制作方案
  • ​创新驱动,边缘计算领袖:亚马逊云科技海外服务器服务再进化
  • #微信小程序:微信小程序常见的配置传旨
  • (附源码)springboot人体健康检测微信小程序 毕业设计 012142
  • (更新)A股上市公司华证ESG评级得分稳健性校验ESG得分年均值中位数(2009-2023年.12)
  • (七)微服务分布式云架构spring cloud - common-service 项目构建过程
  • (十七)Flask之大型项目目录结构示例【二扣蓝图】
  • (译)计算距离、方位和更多经纬度之间的点
  • (原創) 是否该学PetShop将Model和BLL分开? (.NET) (N-Tier) (PetShop) (OO)
  • ***监测系统的构建(chkrootkit )
  • .FileZilla的使用和主动模式被动模式介绍
  • .Net 6.0 处理跨域的方式
  • .net core IResultFilter 的 OnResultExecuted和OnResultExecuting的区别
  • .NET Core 中的路径问题
  • .Net Framework 4.x 程序到底运行在哪个 CLR 版本之上
  • .NET 程序如何获取图片的宽高(框架自带多种方法的不同性能)