oracle 用更高效的方法代替 LIKE 關鍵字的模糊查詢
在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 一個效果了。