解读Oracle中代替like进行模糊查询的方法instr(更高效)

 更新时间:2022年11月18日 16:25:29   作者:每天都要进步一点点  
这篇文章主要介绍了解读Oracle中代替like进行模糊查询的方法instr(更高效),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

一、简介

相信大家都使用过like进行模糊匹配查询,在oracle中,instr()方法可以用来代替like进行模糊查询,大数据量的时候效率更高。

本文将对instr()的基本使用方法进行详解以及通过示例讲解与like的效率对比。

二、使用说明

instr(sourceString,destString,start,appearPosition)     

对应参数描述 

instr('源字符串' , '目标字符串' ,'开始位置','第几次出现'),返回目标字符串在源字符串中的位置。

后面两个参数可要可不要。

我们以一些示例讲解使用方法

【a】从开头开始查找第一个‘h’出现的位置

--从开头开始查找第一个‘h'出现的位置
select instr('zhangsan', 'h') as idx from dual; --2

查询结果:

【b】从开头开始查找‘an’在字符串中的位置

--从开头开始查找‘an'在字符串中的位置
select instr('zhangsan','an') idx from dual; --3

查询结果:

【c】从第一个位置开始查找,返回第二次出现‘a’的位置

--从第一个位置开始查找,返回第二次出现‘a'的位置
select instr('zhangsan','a',1,'2') idx from dual; --7

查询结果:

【d】从倒数第一个位置开始,查找第一次出现‘a’的位置

--从倒数第一个位置开始,查找第一次出现‘a'的位置
select instr('zhangsan','a',-1,1) idx from dual;  --7

查询结果:

【e】从倒数第一个位置开始,返回第二次出现‘a’的位置

--从倒数第一个位置开始,返回第二次出现‘a'的位置
select instr('zhangsan','a',-1,2) idx from dual;   --3

查询结果:

三、instr()与like比较

instr函数也有三种情况

  • a. instr(字段,'关键字') > 0    相当于 字段like '%关键字%':        表示在字符串中包含‘关键字’
  • b. instr(字段,'关键字') = 1    相当于 字段like '关键字%'            表示以‘关键字’开头的字符串
  • c. instr(字段,'关键字') = 0    相当于 字段not like '%关键字%'  表示在字符串中不包含‘关键字’

下面通过一个示例说明like 与 instr()的使用比较

【a】使用like进行模糊查询

with temp1 as (
select 'zhangsan' as name from dual),
temp2 as (
select 'zhangsi' as name from dual),
temp3 as (
select 'xiaoming' as name from dual),
temp4 as (
select 'xiaohong' as name from dual),
temp5 as (
select 'zhaoliu' as name from dual)
 
select * from (select * from temp1 
union all
select * from temp2
union all
select * from temp3
union all
select * from temp4
union all
 
select * from temp5) res where res.name like '%zhang%'

查询字符串中包含‘zhang’的结果:

【b】使用instr()进行模糊查询

(1) 查询字符串中包含‘zhang’的结果:

with temp1 as (
select 'zhangsan' as name from dual),
temp2 as (
select 'zhangsi' as name from dual),
temp3 as (
select 'xiaoming' as name from dual),
temp4 as (
select 'xiaohong' as name from dual),
temp5 as (
select 'zhaoliu' as name from dual)
 
select * from (select * from temp1 
union all
select * from temp2
union all
select * from temp3
union all
select * from temp4
union all
 
 
select * from temp5) res where instr(res.name,'zhang') > 0;

(2) 查询字符串中不包含‘zhang’的结果:

with temp1 as (
select 'zhangsan' as name from dual),
temp2 as (
select 'zhangsi' as name from dual),
temp3 as (
select 'xiaoming' as name from dual),
temp4 as (
select 'xiaohong' as name from dual),
temp5 as (
select 'zhaoliu' as name from dual)
 
select * from (select * from temp1 
union all
select * from temp2
union all
select * from temp3
union all
select * from temp4
union all
 
select * from temp5) res where instr(res.name,'zhang') = 0;

(3) 查询以‘zhang’开头的字符串:

with temp1 as (
select 'zhangsan' as name from dual),
temp2 as (
select 'zhangsi' as name from dual),
temp3 as (
select 'sizhangsan' as name from dual),
temp4 as (
select 'xiaohong' as name from dual),
temp5 as (
select 'zhaoliu' as name from dual)
 
select * from (select * from temp1 
union all
select * from temp2
union all
select * from temp3
union all
select * from temp4
union all
 
 
select * from temp5) res where instr(res.name,'zhang') = 1;

(4)instr与like特殊用法

select id, name from users where instr('a, b', id) > 0;
--等价于
select id, name
  from users
 where id = a
    or id = b;
--等价于
select id, name from users where id in (a, b);

四、效率对比

【a】使用plsql创建一张十万条数据测试数据表,同时为需要进行模糊查询的列增加索引

--创建10万条测试数据
create table test_instr_like as 
select rownum as id,'zhangsan' as name 
from dual
connect by level <= 100000;
 
--name列建立索引
create index idx_tb_name on test_instr_like(name);

【b】使用like进行模糊查询

select * from TEST_INSTR_LIKE t where t.name like '%zhang%'

总耗时: 60秒

【c】使用instr进行模糊查询

select * from TEST_INSTR_LIKE t where instr(t.name, 'zhang') > 0;

总耗时:50秒

由图可见,instr查询的速度确实比like快一些,但是,看执行计划的话,instr却比like耗时一点。如下图:

五、总结

以上是对instr基本使用方法的讲解以及通过示例对比了like与instr的效率,在进行模糊查询的时候,能用instr的话就尽量用instr,毕竟数据量大的时候还是有一点优势的,本文是笔者对like以及instr的一些总结和见解,仅供大家学习参考,也希望大家多多支持脚本之家。

相关文章

  • Oracle中PL/SQL的用法总结

    Oracle中PL/SQL的用法总结

    本文详细讲解了Oracle中PL/SQL的用法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05
  • Oracle数据库使用sqlplus时的连接错误与方向键乱码解决

    Oracle数据库使用sqlplus时的连接错误与方向键乱码解决

    这篇文章主要介绍了Oracle数据库使用sqlplus时的连接错误与方向键乱码解决方法,实例环境基于Linux操作系统,需要的朋友可以参考下
    2016-01-01
  • oracle查询锁表及解锁,修改表字段名与复制表结构和数据的方法

    oracle查询锁表及解锁,修改表字段名与复制表结构和数据的方法

    今天小编就为大家分享一篇关于oracle查询锁表及解锁,修改表字段名与复制表结构和数据的方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • Oracle数据的插入insert、更新update、删除delete、truncate举例详解

    Oracle数据的插入insert、更新update、删除delete、truncate举例详解

    SQL语法是所有操作的基础,包括创建、查询、更新和删除数据,下面这篇文章主要给大家介绍了关于Oracle数据的插入insert、更新update、删除delete、truncate的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-07-07
  • 一文详解Oracle中RAC的用法

    一文详解Oracle中RAC的用法

    Oracle RAC(Oracle Real Application Server, Cluster)是一种分布式数据库解决方案,本文就将详细给大家介绍一下Oracle RAC的知识点及用法,感兴趣的同学可以参考阅读
    2023-06-06
  • Oracle11g RAC开启关闭、设置归档小结

    Oracle11g RAC开启关闭、设置归档小结

    这篇文章主要介绍了Oracle11g RAC开启关闭、设置归档,很简单,但很实用,需要的朋友可以参考下
    2014-09-09
  • 利用PL/SQL从Oracle数据库导出和导入数据

    利用PL/SQL从Oracle数据库导出和导入数据

    这篇文章主要为大家详细介绍了利用PL/SQL从Oracle数据库导出数据和导入数据,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-03-03
  • Oracle存储过程的几种调用方式图文详解

    Oracle存储过程的几种调用方式图文详解

    存储过程是一个预编译的SQL语句,优点是允许模块化的设计,就是说只需创建一次,以后在程序中就可以调用多次,下面这篇文章主要给大家介绍了关于Oracle存储过程的几种调用方式,需要的朋友可以参考下
    2023-04-04
  • Oracle数据加载和卸载的实现方法

    Oracle数据加载和卸载的实现方法

    这篇文章主要介绍了Oracle数据加载和卸载的实现方法,非常不错,具有一定的参考借鉴加载,需要的朋友可以参考下
    2018-08-08
  • Oracle以逗号分隔的字符串拆分为多行数据实例详解

    Oracle以逗号分隔的字符串拆分为多行数据实例详解

    做多选功能时为了简便,会在某个字段中存储多个值,保存时虽然省事,但后续的查询统计时还需要拆分数据才行,因此这时需要将字段内的值分成多行以便后续使用,这篇文章主要给大家介绍了关于Oracle以逗号分隔的字符串拆分为多行数据的相关资料,需要的朋友可以参考下
    2021-07-07

最新评论