模糊查询like 和 函数instr使用 对比

PS : 网上看资料博客什么的结合起来的结果
前言 :模糊查询一般是使用Like 和 instr() ;使用模糊查询Like的时候,如果该字段没有索引,或者数据量大的话(百万级的数据量吧),会出现效率慢的问题。
模糊查询技巧
使用oracle本身的函数instr可以达到模糊查询的效果,且效率快。
另外,使用oracle的函数contains可以模糊查询,但是使用contains的字段必须是已经添加了索引Index的字段,否则会报错:无效的关系运算符。
查找字符函数 instr(...) 介绍
instr(string, subString, [start_position, [nth_appearance]])
其中,string是元字符串; (字段名)
subString是要查找的子字符串; (模糊查询的内容)
start_position是要查找的开始位置,为可选项(默认为1),注意在这里字符串索引从1开始,如果此参数为正,则从左到右检索,如果此参数为负,则从右到左检索;nth_appearance是元字符串中第几次出现的子字符串,此参数可选,缺省默认为1,如果是负数则系统报错。
例子:
instr('ABCDABCDAEF', 'AB');   -- 返回结果是:1,因为instr字符串索引从1开始,所以是1不是0
instr('ABCDABCDAEF', 'DA', 1, 2);   -- 返回结果是:8,返回第二次出现'DA'的位置
instr('A BCDABCDAEF', 'DA', 1, 2);  -- 返回结果是:9,由于我在元字符串中加了一个空格,空格仍然算一个字符
instr代替Like具体使用技巧:
instr(name,'张三')>0  相当于  name like '%张三%'
instr(name,'张三')=1  相当于  name like '张三%'

instr(name,'张三')=0  相当于  name not like '%张三%'

---分割---
查找字符函数 contains(...) 介绍
CONTAINS谓词
该函数是一个谓词,用于搜索包含基于字符的数据类型的列,该列与单个词和短语,以及与另一个词在一定范围之内的近似词精确、模糊(不太精确的)或者加权匹配。CONTAINS可以搜索如下词语:
(1)词或短语。
(2)词或短语的前缀。
(3)另一个词附近的词。
(4)由另一个词的词尾变化生成的词(例如,词drive是drives、drove、driving和driven词尾变化的词干)。
(5)比另一个词具有更高加权的词。
语法:CONTAINS ....
参数说明:
   column:已经注册全文检索的特定列的名称。字符串数据类型的列是有效的全文检索列。
   <contains_search_condition>:指定要在列中搜索的文本。变量不能用作搜索条件。
   word:没有空格或标点符号的字符串。
   phrase:在每个词之间带有空格的一个或多个词。
该函数只能在WHERE子句中使用 。其括号内参数会传递给Microsoft搜索服务,而Microsoft搜索服务则会返回符合指定条件的主键列表。
注意: 该函数只能用于已创建全文索引的数据表,并启动完全填充 。对数据表中的数据进行修改后,应重新启动完全填充,否则将检索上一次启动完全填充的数据。
                ---分割---

备注: 或者利用索引提高查询效率,可以索引+instr
        感觉数据量大概在百万级的效率差别比较明显,我用十多万的时候感觉没有明显区别。
-------- --------------------------------
instr()特殊用法:  - -别人的博客中刚看到的,感觉这个是有问题的,在该字段存在类似上下级关系的时候.
select   id, name from users where instr('101914, 104703', id) > 0; 
  它等价于 
select   id, name from users where id = 101914 or id = 104703;

上面这个没有问题,但是如果是下面这种情况

如果存在三个users,id分别是:101,101914,104703

那么select   id, name from users where instr('101914, 104703', id) > 0; 的结果是三个user,因为id=101的时候,能够在101914查找到 .

select   id, name from users where id = 101914 or id = 104703; 只有两个

猜你喜欢

转载自blog.csdn.net/wylsde_zjy/article/details/80183700