1. 程式人生 > >oracle 用更高效的方法代替 LIKE 關鍵字的模糊查詢

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 一個效果了。