Oracle Like、Instr以及正则表达式
查看测试数据
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以及正则表达式的更多相关文章
- ORACLE中的支持正则表达式的函数
ORACLE中的支持正则表达式的函数主要有下面四个:1,REGEXP_LIKE :与LIKE的功能相似2,REGEXP_INSTR :与INSTR的功能相似3,REGEXP_SUBSTR :与SUBS ...
- oracle 判断是否数字 正则表达式法
SELECT '-100' FROM dual WHERE REGEXP_LIKE('-100','(^[+-]?\d{0,}\.?\d{0,}$)'); REGEXP_LIKE 用法: ...
- Oracle中INSTR、SUBSTR和NVL的用法
Oracle中INSTR.SUBSTR和NVL的用法 INSTR用法:INSTR(源字符串, 要查找的字符串, 从第几个字符开始, 要找到第几个匹配的序号) 返回找到的位置,如果找不到则返回0. 默认 ...
- Oracle中 Instr 这个函数
http://www.jb51.net/article/42369.htm sql :charindex('字符串',字段)>0 charindex('administrator',MUserI ...
- oracle instr函数(oracle 用instr 来代替 like)
oracle instr函数 对于instr函数,我们经常这样使用:从一个字符串中查找指定子串的位置.例如: SQL> select instr('Oracle','or') position ...
- 使用Oracle的instr函数与索引配合提高模糊查询的效率
使用Oracle的instr函数与索引配合提高模糊查询的效率 一般来说,在Oracle数据库中,我们对tb表的name字段进行模糊查询会采用下面两种方式:1.select * from tb wher ...
- Oracle中Instr用法
在项目中用到了Oracle中 Instr 这个函数,顺便仔细的再次学习了一下这个知识. Oracle中,可以使用 Instr 函数对某个字符串进行判断,判断其是否含有指定的字符. 其语法为:Instr ...
- Oracle中INSTR函数与SQL Server中CHARINDEX函数
Oracle中INSTR函数与SQL Server中CHARINDEX函数 1.ORACLE中的INSTR INSTR函数格式:INSTR(源字符串, 目标字符串, 起始位置, 匹配序号) 说明:返回 ...
- PostgreSQL模仿Oracle的instr函数
-- -- instr functions that mimic Oracle's counterpart -- Syntax: instr(string1, string2, [n], [m]) w ...
随机推荐
- 为什么我用gets不行呢?系统无视了我的存在!!!
梗概:为什么我用gets不行呢?系统无视了我的存在!!!我还没输入东东啊..怎么就提示[请安任意键继续]的?? 原来是缓冲区的问题啊? 一.什么是缓冲区 缓冲区又称为缓存,它是内存空间的一部分.也就是 ...
- 性能测试工具Jmeter08-Jmeter断言(检查点)
断言是在请求的返回层面增加一层判断机制.因为请求成功了,并不代表结果一定正确,因此需要检测机制提高测试准确性. 下面介绍常用的jmeter三种断言 1.响应断言 例如: 模式匹配规则 2.Size A ...
- linux 防止ssh暴力破解密码
收集 /var/log/secure 里面的信息,若是某个IP 链接次数超过一定次数 ,则把此ip记录到/etc/hosts.deny里面 #!/bin/bash #Denyhosts SHELL S ...
- React.js 小书 Lesson3 - 前端组件化(二):优化 DOM 操作
作者:胡子大哈 原文链接:http://huziketang.com/books/react/lesson3 转载请注明出处,保留原文链接和作者信息. 看看上一节我们的代码,仔细留意一下 change ...
- 谷歌添加百度翻译提示Google已将百度翻译标记为恶意程序并阻止安装,怎么办
进入谷歌浏览器的设置, 显示高级设置——隐私设置下七个选项中的第四个选项(启用针对网上诱骗和恶意软件的防护功能)把勾去掉,然后将百度翻译的CRX拖动到chrome的安装插件页面, 修改chrome的限 ...
- C# 和 Linux 时间戳转换
/// <summary> /// 时间戳转为C#格式时间 /// </summary> /// <par ...
- 【干货】Html与CSS入门学习笔记9-11
九.盒模型 与元素亲密接触 1.盒模型 css将每个元素都看做一个盒子,包括以下属性: 内容区content area:包含内容,内容可以决定大小,也可以自行设定宽度和高度.元素的width属性指定的 ...
- matlab练习程序(粒子群优化PSO)
算法没有和图像处理直接相关,不过对于图像分类中的模式识别相关算法,也许会用到这个优化算法. 算法步骤: 1.首先确定粒子个数与迭代次数. 2.对每个粒子随机初始化位置与速度. 3.采用如下公式更新每个 ...
- constrained属性
hibernate文档上是这么写的: constrained(约束) (可选) 表明该类对应的表对应的数据库表,和被关联的对象所对应的数据库表之间,通过一个外键引用对主键进行约束.这个选项影响save ...
- mysql:JDBC url 参数详解
MySql链接url参数详解 jdbc:mysql://[host:port],[host:port].../[database][?参数名1][=参数值1][&参数名2][=参数值2]... ...