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 操作符不能使用正则表达式语法,但是它可以使用前缀索引进行优化,可以在满足需求的情况下提高性能。

到此这篇关于oracle中sql 正则怎么写的文章就介绍到这了,更多相关oracle sql 正则内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Oracle正则表达式使用介绍

    下面通过一些例子来说明使用正则表达式来处理一些工作中常见的问题. 1. REGEXP_SUBSTR REGEXP_SUBSTR 函数使用正则表达式来指定返回串的起点和终点,返回与source_string 字符集中的VARCHAR2 或CLOB 数据相同的字符串. 语法: --1.REGEXP_SUBSTR与SUBSTR函数相同,返回截取的子字符串 REGEXP_SUBSTR(srcstr, pattern [, position [, occurrence [, match_option]]]

  • oracle正则表达式regexp_like的用法详解

    /*ORACLE中的支持正则表达式的函数主要有下面四个:1,REGEXP_LIKE :与LIKE的功能相似2,REGEXP_INSTR :与INSTR的功能相似3,REGEXP_SUBSTR :与SUBSTR的功能相似4,REGEXP_REPLACE :与REPLACE的功能相似它们在用法上与Oracle SQL 函数LIKE.INSTR.SUBSTR 和REPLACE 用法相同,但是它们使用POSIX 正则表达式代替了老的百分号(%)和通配符(_)字符.POSIX 正则表达式由标准的元字符(m

  • Oracle通过正则表达式分割字符串 REGEXP_SUBSTR的代码详解

    REGEXP_SUBSTR函数格式如下: function REGEXP_SUBSTR(string, pattern, position, occurrence, modifier) string :需要进行正则处理的字符串 pattern :进行匹配的正则表达式 position :起始位置,从第几个字符开始正则表达式匹配(默认为1) occurrence :标识第几个匹配组,默认为1 modifier :模式('i'不区分大小写进行检索:'c'区分大小写进行检索.默认为'c') SELEC

  • Oracle 10G:PL/SQL正规表达式(正则表达式)手册

    Oracle 的正规表达式的实施是以各种 SQL 函数和一个 WHERE 子句操作符的形式出现的.如果您不熟悉正规表达式,那么这篇文章可以让您了解一下这种新的极其强大然而表面上有点神秘的功能.已经对正规表达式很熟悉的读者可以了解如何在 Oracle SQL 语言的环境中应用这种功能. 什么是正规表达式? 正规表达式由一个或多个字符型文字和/或元字符组成.在最简单的格式下,正规表达式仅由字符文字组成,如正规表达式 cat.它被读作字母 c,接着是字母 a 和 t,这种模式匹配 cat.locati

  • oracle中sql 正则写法详解

    目录 在Oracle 10g及以下版本中,可以使用POSIX扩展来进行正则匹配 Oracle 11g及以上版本 是否走索引 Oracle中使用正则表达式需先使用REGEXP_LIKE函数来匹配字符串.正则表达式的语法与一般正则表达式相似,但具体的写法也受不同版本的Oracle环境不同. 在Oracle 10g及以下版本中,可以使用POSIX扩展来进行正则匹配 如: ^:匹配字符串的开始位置:$:匹配字符串的结束位置:.:匹配任何单个字符:[ ]:匹配指定集合内的任何字符,如[abc]匹配a.b.

  • Oracle中的MD5加密详解

    一.技术点 1. DBMS_OBFUSCATION_TOOLKIT.MD5 DBMS_OBFUSCATION_TOOLKIT.MD5是MD5编码的数据包函数,但偶在使用select DBMS_OBFUSCATION_TOOLKIT.MD5(input_string =>'abc') a from Dual时,却有错误提示,看来该函数只能直接在程序包中调用,不能直接应用于SELECT语句. 2.Utl_Raw.Cast_To_Raw DBMS_OBFUSCATION_TOOLKIT.MD5返回的字

  • Oracle中的序列SEQUENCE详解

    一.序列介绍 Oracle的序列是一种数据库对象,主要作用是用来产生唯一值.序列被创建以后可以通过数据字典找到序列对象,因此序列可以被多个对象共享. 二.创建序列 序列使用CREATE SEQUENCE语法进行创建: CREATE SEQUENCE sequence [INCREMENT BY n] [START WITH n] [{MAXVALUE n | NOMAXVALUE}] [{MINVALUE n | NOMINVALUE}] [{CYCLE | NOCYCLE}] [{CACHE

  • ORACLE中的的HINT详解

    hints是oracle提供的一种机制,用来告诉优化器按照我们的告诉它的方式生成执行计划.我们可以用hints来实现: 1) 使用的优化器的类型 2) 基于代价的优化器的优化目标,是all_rows还是first_rows. 3) 表的访问路径,是全表扫描,还是索引扫描,还是直接利用rowid. 4) 表之间的连接类型 5) 表之间的连接顺序 6) 语句的并行程度 2.HINT可以基于以下规则产生作用   表连接的顺序.表连接的方法.访问路径.并行度 3.HINT应用范围   dml语句 查询语

  • JS中with的替代方法与String中的正则方法详解

    with 语法 在代码中,要执行这么一个函数 function computeExpression(exp, scope) { try { with (scope) { return eval(exp); } } catch (e) { console.error('ERROR', e); } } 要求在scope 作用域中执行,什么意思??? 比如 scope = {a:10,b:5}; exp = a*b; 要求计算结果为15,这种情况,常规情况下要使用 with语法. 但是: js的解释器

  • oracle中distinct的用法详解

    下面先来看看例子: table表 字段1     字段2    id        name    1           a    2           b    3           c    4           c    5           b 库结构大概这样,这只是一个简单的例子,实际情况会复杂得多. 比如我想用一条语句查询得到name不重复的所有数据,那就必须使用distinct去掉多余的重复记录. select distinct name from table 得到的结果

  • MySQL中的SQL标准语句详解

    目录 前言 对数据库的操作 对表的操作 表的创建 表的插入 表的修改 表的删除 表的查询 条件查询 前言 例如MySQL中的LIMIT语句就是MySQL独有的方言,其它数据库都不支持!当然,Oracle或SQL Server都有自己的方言. 语法要求: SQL语句可以单行或多行书写,以分号结尾: 可以用空格和缩进来来增强语句的可读性: 关键字不区别大小写,建议使用大写: 对数据库的操作 #语法: CREATE DATABASE [IF NOT EXISTS] 数据库名 [DEFAULT CHAR

  • YII框架中搜索分页jQuery写法详解

    控制层 use frontend\models\StudUser; use yii\data\Pagination; use yii\db\Query; /** * 查询 * */ public function actionSearch() { //接值 $where=Yii::$app->request->get(); //实例化query $query=new Query(); $query->from('stud_user'); //判断 if(isset($where['sex

  • jsp中过滤器选择过滤器的写法详解

    实例如下: public class LoginCheckFilter implements Filter { private FilterConfig config=null; private String webroot=null; public void destroy() { // TODO Auto-generated method stub } @Override public void doFilter(ServletRequest req, ServletResponse res

  • SQL中的开窗函数详解可代替聚合函数使用

    在没学习开窗函数之前,我们都知道,用了分组之后,查询字段就只能是分组字段和聚合的字段,这带来了极大的不方便,有时我们查询时需要分组,又需要查询不分组的字段,每次都要又到子查询,这样显得sql语句复杂难懂,给维护代码的人带来很大的痛苦,然而开窗函数出现了,曙光也来临了.如果要想更具体了解开窗函数,请看书<程序员的SQL金典>,开窗函数在mysql不能使用. 开窗函数与聚合函数一样,都是对行的集合组进行聚合计算.它用于为行定义一个窗口(这里的窗口是指运算将要操作的行的集合),它对一组值进行操作,不

随机推荐