原文地址:http://blog.csdn.net/u013492963/article/details/24382191
在oracle 中一遇到模糊查询,我们就会不由自主地想到 LIKE 关键字,一般情况下都是屡试不爽;
但是如果你的数据量很大,就不得不考虑查询效率的问题,这个时候如果用 LIKE 关键字的话可能
效率就非常低,你会不由自主地去思考用更有效率的方法去代替 LIKE,不知道你有没有
找出更好的方法。
下面是个人拙见(有更好方法的朋友可以共享一下心得):
我的办法是用 oracle 函数 INSTR()来代替 LIKE 关键字。
具体举例如下:
比如我们有一张号码表 TEL 表,其中有字段 TELNUM , 假如表中有十几万条数据,
我们要查询以158开头的号码的信息:我们肯定会不约而同的想到
SELECT * FROM TEL WHERE TELNUM LIKE '158%';
毫无疑问这个sql是正确的,但是,你会发现我们的查询速度似乎很慢,遇到这种情况总是让人感到很憋屈,怎么办?下面是我的办法:用函数 INSTR代替 LIKE 如下:
SELECT * FROM TEL WHERE INSTR(TELNUM, '158') = 1;
什么意思呢?,没用过这个函数的可能不太知道什么意思,下面说一下 INSTR()函数的作用
INSTR(参数1,参数2)其实是一个查找字符串的函数,返回的是字符串查找的位置,它有两个参数都是字符类型,如果找到则返回参数2在参数1中的位置,如果没有找到则返回 0。
例如:
SELECT INSTR('abcde', 'a') FROM DUAL;
--------------------------------------------
1
--------------------------------------------
结果分析,因为a在abcde的第一个位置,所以返回1
SELECT INSTR('abcde', 'f') FROM DUAL;
--------------------------------------------
0
--------------------------------------------
结果分析,因为f在abcde串中找不到,所以返回0
注:
instr(title,’手册’)>0 相当于like
instr(title,’手册’)=0 相当于not like
下面看看我们刚才写的那个sql
SELECT * FROM TEL WHERE INSTR(TELNUM, '158') = 1;
这个能看明白了吧,这就是说,我们在TELNUM中查找 '158',如果在第一个位置就找到了,那么就查询出这条数据,这样就和 LIKE 一个效果了。