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; 只有两个