查看测试数据

select * from student;

1. like

在where字句中使用like可以达到模糊查询的效果,常用通配符如下

▶ %: 使用 % 有三种情况

① 字段 like ‘%关键字%’字段包含”关键字”的记录

select * from student where stu_name like '%一%';

查询结果是stu_name字段中所有包含“一”关键字的记录。

② 字段 like ‘关键字%’字段以”关键字”开始的记录

select * from student where stu_name like '一%';

查询结果是stu_name字段中所有以“一”关键字开始的行。

③ 字段 like ‘%关键字’字段以”关键字”结束的记录

select * from student where stu_name like '%一';

查询结果是stu_name字段中所有以“一”关键字结束的记录。

▶ _:单一任何字符,只能匹配单个的字符,使用示例如下

select * from student where stu_name like '_一';

查询结果为只有个字符,并且第二个字符为“一”的记录。

select * from student where stu_name like '_一_';

查询结果为只有个字符,并且第二个字符为“一”的记录。

select * from student where stu_name like '_一%';

可以与通配符%一起使用,查询结果为第二个字符为“一”的所有记录。

2. regexp_like

▶ []: 实际应用中,会碰到要查询在某一范围内的字符,表示括号内所列字符的一个,类似正则表达式。指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。

① 查询名为“一”,姓“刘李孙”的学生姓名

--错误示范,无法查询到结果

select * from student where stu_name like '[刘李孙]一';

--正确示范

select * from student where regexp_like(stu_name,'[刘李孙]一');

② 查询[]内有一系列字符,如1234,abcd等记录

--错误示范,无法查询到结果

select * from student where stu_name like '赵[1-9]';

--正确示范

select * from student where regexp_like(stu_name,'赵[1-9]');

注意:[]不能与%或者_一起使用。无法查询到正确的结果。

▶ ^:不在某个范围内

① 查询名为“一”,姓不是“刘李孙”的学生姓名

--错误示范,无法查询到结果

select * from student where stu_name like '[^刘李孙]一';

--正确示范

select * from student where regexp_like(stu_name,'[^刘李孙]一');

3. Instr(StrSource,StrTarget)

instr函数也有三种情况:

① instr(字段,’关键字’)>0相当于 字段like ‘%关键字%’

② instr(字段,’关键字’)=1相当于 字段like ‘关键字%’

③ instr(字段,’关键字’)=0相当于 字段not like ‘%关键字%’

--特殊用法:

select * from student where instr('李一,刘一', stu_name) > 0;

--不完全等价于

select * from student where stu_name = '李一' or stu_name =  '刘一';

这种特殊用法会奖满足条件的条件的字符串,和单个字符串数据都筛选出来。数据规范的情况下,这两者是等价的。

数据量比较小的时候,使用like,数据量较大情况下,使用instr,数据量更大情况下,使用Oracle的instr函数与索引配合提高模糊查询的效率。

4. like、instr性能测试

很多时候,我们要进行字符串匹配,在SQL语句中,我们通常使用like来达到我们搜索的目标。但经过实际测试发现,like的效率与instr函数有相当大的差别。

① 1000多万条数据,测试时like的效率与instr函数差别不是特别大。

select count(*) from student;

--数据结果:11855410

select count(*) from student where stu_name like '%王%';

--数据结果:702077

--测试时间:1.966秒

select count(*) from student where instr(stu_name,'王');

--数据结果:702077

--测试时间:2.137秒

② 亿级数量级,测试结果instr效果明显好于like。

select count(*) from student;

--数据结果:2244661391

select count(*) from student where stu_name like '%王%';

--数据结果:415065640

--测试时间:86.939秒

select count(*) from student where instr(stu_name,'王');

--数据结果:415065640

--测试时间:60.591秒

为提高效率,我们在stu_name字段上可以加上非唯一性索引,这样,再使用这样的语句查询,效率可以提高不少,表数据量越大时两者差别越大。

✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍扩展阅读✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍

5. 正则表达式

oracle 10g 增加的正则表达式函数有以下四种:

regexp_like() --返回满足条件的字段

regexp_instr() --返回满足条件的字符或字符串的位置

regexp_replace() --返回替换后的字符串

regexp_substr() --返回满足条件的字符或字符串

这四个函数的功能分别对应传统sql的 like操作符 和 instr 、replace 、substr函数,

在一般的、不怎么复杂的模式匹配中,使用传统的sql函数就能满足,当需要实现的操作

比较复杂时,使用正则表达式函数,就可以写出简洁、强大的sql语句。

匹配过程中可能会涉及到的元字符(Meta Character)对应的sql代码:

^ 使表达式定位至一行的开头

$ 使表达式定位至一行的末尾

* 匹配0次或更多次

? 匹配0次或1次

+ 匹配1次或更多次

{m} 正好匹配m次

{m,} 至少匹配m次

{m,n} 至少匹配m次但不超过n次

[:alpha:] 字母字符,匹配字符A-Z、a-z

[:lower:] 小写字母字符,匹配字符a-z

[:upper:] 大写字母字符,匹配字符A-Z

[:digit:] 数字,匹配数字0-9

[:alphanum:] 字母数字字符,匹配字符A-Z、a-z、0-9

[:space:] 空白字符(禁止打印),如回车、换行符、竖直制表符和换页符[:punct:] 标点字符

[:cntrl:] 控制字符(禁止打印)

[:print:] 可打印字符|分隔替换选项,通常与分组符()一期使用

() 将子表达式分组为一个替换单元,量词单元或后向引用单元

[char] 字符列表

. 匹配除null之外的任意单个字符

/ 要匹配的字符是一个特殊字符、常量或者后者引用

x|y 匹配 x 或 y

[abc] 匹配abc中的任何单个字符

[a-z] 匹配 a 到 z 范围内的任意单个字符

✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍扩展阅读✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍

Oracle Like、Instr以及正则表达式的更多相关文章

  1. ORACLE中的支持正则表达式的函数

    ORACLE中的支持正则表达式的函数主要有下面四个:1,REGEXP_LIKE :与LIKE的功能相似2,REGEXP_INSTR :与INSTR的功能相似3,REGEXP_SUBSTR :与SUBS ...

  2. oracle 判断是否数字 正则表达式法

     SELECT '-100'    FROM dual   WHERE REGEXP_LIKE('-100','(^[+-]?\d{0,}\.?\d{0,}$)'); REGEXP_LIKE 用法: ...

  3. Oracle中INSTR、SUBSTR和NVL的用法

    Oracle中INSTR.SUBSTR和NVL的用法 INSTR用法:INSTR(源字符串, 要查找的字符串, 从第几个字符开始, 要找到第几个匹配的序号) 返回找到的位置,如果找不到则返回0. 默认 ...

  4. Oracle中 Instr 这个函数

    http://www.jb51.net/article/42369.htm sql :charindex('字符串',字段)>0 charindex('administrator',MUserI ...

  5. oracle instr函数(oracle 用instr 来代替 like)

    oracle instr函数 对于instr函数,我们经常这样使用:从一个字符串中查找指定子串的位置.例如: SQL> select instr('Oracle','or') position ...

  6. 使用Oracle的instr函数与索引配合提高模糊查询的效率

    使用Oracle的instr函数与索引配合提高模糊查询的效率 一般来说,在Oracle数据库中,我们对tb表的name字段进行模糊查询会采用下面两种方式:1.select * from tb wher ...

  7. Oracle中Instr用法

    在项目中用到了Oracle中 Instr 这个函数,顺便仔细的再次学习了一下这个知识. Oracle中,可以使用 Instr 函数对某个字符串进行判断,判断其是否含有指定的字符. 其语法为:Instr ...

  8. Oracle中INSTR函数与SQL Server中CHARINDEX函数

    Oracle中INSTR函数与SQL Server中CHARINDEX函数 1.ORACLE中的INSTR INSTR函数格式:INSTR(源字符串, 目标字符串, 起始位置, 匹配序号) 说明:返回 ...

  9. PostgreSQL模仿Oracle的instr函数

    -- -- instr functions that mimic Oracle's counterpart -- Syntax: instr(string1, string2, [n], [m]) w ...

随机推荐

  1. AndroidAPI

    1词典 百度翻译 http://api.fanyi.baidu.com/api/trans/product/index 百度翻译支持多种语言互相翻译,包含PHP, JS, Python, C, Jav ...

  2. ST-LINK接口定义

    ST-LINKIII管脚定义及接法:     ST-LINK IIILED灯三种状态含义: 常亮:目标板与ST-LINK在SWIM模式或者JTAG/SWD模式下已经通讯初始化. 闪烁:目标板与ST-L ...

  3. 牛客网Java刷题知识点之字节流练习之从A处复制文本文件到B处(FileReader、FileWriter )、复制文本文件的原理图解

    不多说,直接上干货! CopyTextTest.java package zhouls.bigdata.DataFeatureSelection.test; import java.io.FileRe ...

  4. 【client】与【offset】

    上面主要区分了[offset]和[client]开头的各个属性的意义,下面这张图是转载的,又加入了[scroll]开头的,和元素本身的[style] clientWidth   是对象看到的宽度(不含 ...

  5. CRLF注入攻击

      原理:http数据包通过\r\n\r\n来分开http header何http body 实现:首先这种攻击发生在应用层,且发生在服务器返回给我们的http reponse没有经过敏感字符的过滤, ...

  6. jq学习总结之方法

    三.方法 1.length 2.index()3.get() reverse()4.not()5.filter()6.find()7.each()8.addBack()9.attr()10.toggl ...

  7. Hibernate课程 初探一对多映射3-1 单向多对一简介

    多对一的关系和关系数据库中的外键参照关系最匹配,即在己方的表中的一个外键参照另一个表中的主键! 通过在多方持有一方的引用来实现,需要在多的一方使用<many-to-one>来配置

  8. hibernate课程 初探一对多映射2-6 测试-添加和查询学生信息

    package com.ddwei.entity; import java.util.Set; import org.hibernate.Session; import org.hibernate.T ...

  9. Python异常处理及元类

    一.异常处理 异常是错误发生的信号,一旦程序出错就会产生一个异常,如果该异常没有被应用程序处理,那么该异常就会跑出来,程序的执行也随之终止,也就是说异常就是一个事件,该事件会在程序执行过程中发生,影响 ...

  10. jQuery(四)(DOM一)

    jQuery把复杂的代码简单化. 如果我们通过AJAX获取到数据之后然后才能确定结构的话,这种情况就需要动态的处理节点了 一.DOM节点的创建:创建div节点元素的属性和创建div节点元素的样式doc ...