標籤:oracle 模糊查詢 like 索引 搜尋
在這個資訊量劇增的時代,如何協助使用者從海量資料中檢索到想要的資料,模糊查詢是必不可少的。那麼在Oracle中模糊查詢是如何?的呢?
一、我們可以在where子句中使用like關鍵字來達到Oracle模糊查詢的效果;在Where子句中,可以對datetime、char、varchar欄位類型的列用Like關鍵字配合萬用字元來實現模糊查詢,以下是可使用的萬用字元:
(1)% :零或者多個字元,使用%有三種情況
- 欄位 like ‘%關鍵字%‘欄位包含"關鍵字"的記錄
- 欄位 like ‘關鍵字%‘欄位以"關鍵字"開始的記錄
- 欄位 like ‘%關鍵字‘欄位以"關鍵字"結束的記錄
例子:
- SELECT * FROM [user] WHERE uname LIKE ‘%三%‘
搜尋結果:“張三”,“小三”、“三腳貓”,“貓三腳” 有“三” 的記錄全找出來。
- SELECT * FROM [user] WHERE uname LIKE ‘%三‘ (從後開始匹配)
搜尋結果:“張三”,“小三”
- 另外,如果需要找出uname中既有“三”又有“貓”的記錄,請使用and條件
SELECT *FROM [user] WHERE uname LIKE ‘%三%‘ AND uname LIKE ‘%貓%‘
- 若使用SELECT * FROM [user] WHERE uname LIKE ‘%三%貓%‘,雖然能搜尋出“三腳貓”,但不能搜尋出“貓三腳”。
(2)_: 單一任何字元(底線)常用來限制運算式的字元長度語句:
例子:
- SELECT * FROM [user] WHERE uname LIKE ‘_三_‘
搜尋結果:“貓三腳”這樣uname為三個字元且中間一個是“三”的;
- SELECT * FROM [user] WHERE uname LIKE ‘三__‘;
搜尋結果:“三腳貓”這樣uname為三個字元且第一個是“三”的;
(3)[]:在某一範圍內的字元,表示括弧內所列字元中的一個(類似Regex)。指定一個字元、字串或範圍,要求所匹配對象為它們中的任一個。
例子:
- SELECT * FROM [user] WHERE u_name LIKE ‘[張李王]三‘
搜尋結果:“張三”、“李三”、“王三”(而不是“張李王三”);
如 [ ]內有一系列字元(01234、abcde之類的)則可略寫為“0-4”、“a-e”
- SELECT * FROM [user] WHERE u_name LIKE ‘老[1-9]‘
搜尋結果:“老1”、“老2”、……、“老9”;
(4)[^]: 不在某範圍內的字元,用法與[ ]相反。
二、在Oracle中提供了instr(strSource,strTarget)函數,比使用‘%關鍵字%‘的模式效率高很多。
instr函數也有三種情況:
instr(欄位,‘關鍵字‘)>0相當於 欄位like ‘%關鍵字%‘
instr(欄位,‘關鍵字‘)=1相當於 欄位like ‘關鍵字%‘
instr(欄位,‘關鍵字‘)=0相當於 欄位not like ‘%關鍵字%‘
例子:
- SELECT * FROM [user] WHEREinstr(uname,‘三‘)>0
用法參照上面的Like 即可
特殊用法:
select id, namefrom user where instr(‘101914, 104703‘, id) > 0;
它等價於
select id, namefrom user where id = 101914 or id = 104703;
在資料量比較少的時候,可以直接使用上面這兩種方法,但是當資料量特別大的時候,我們就應該考慮效率的問題了。雖說在效率上Instr比like關鍵字方法效率要高出不少,但這也僅僅是在一定程度上而言,遠不能滿足我們的需要。
為什麼關鍵字查詢效率這麼低呢?這是由於在利用這些關鍵字查詢的時候,資料庫系統不是通過索引來查詢,而是採用順序掃描的方式來查詢。顯然,真是這種技術特性,造成了Like關鍵字查詢效率的低下。特別是在複雜查詢或者大表查詢中,使用者可以明顯感覺到速度比較慢。
怎麼解決效率的難題呢?答案也正是索引。
合理的利用索引,可以大幅度的提升資料庫的查詢效能。
關於索引的合理應用,還在研究中。。
Oracle 模糊查詢方法