在這個信息量劇增的時代,如何幫助用戶從海量數據中檢索到想要的數據,模糊查詢是必不可少的。那麼在Oracle中模糊查詢是如何實現的呢?正則表達式
1、咱們能夠在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)[]:在某一範圍內的字符,表示括號內所列字符中的一個(相似正則表達式)。指定一個字符、字符串或範圍,要求所匹配對象爲它們中的任一個。 例子: SELECT * FROM [user] WHERE u_name LIKE '[張李王]三' 搜索結果:「張三」、「李三」、「王三」(而不是「張李王三」); 如 [ ]內有一系列字符(0123四、abcde之類的)則可略寫爲「0-4」、「a-e」 SELECT * FROM [user] WHERE u_name LIKE '老[1-9]' 搜索結果:「老1」、「老2」、……、「老9」;性能
(4)[^]: 不在某範圍內的字符,用法與[ ]相反。對象
2、在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;get
在數據量比較少的時候,能夠直接使用上面這兩種方法,可是當數據量特別大的時候,咱們就應該考慮效率的問題了。雖然說在效率上Instr比like關鍵字方法效率要高出很多,但這也僅僅是在必定程度上而言,遠不能知足咱們的須要。效率
爲何關鍵字查詢效率這麼低呢?這是因爲在利用這些關鍵字查詢的時候,數據庫系統不是經過索引來查詢,而是採用順序掃描的方式來查詢。顯然,真是這種技術特性,形成了Like關鍵字查詢效率的低下。特別是在複雜查詢或者大表查詢中,用戶能夠明顯感受到速度比較慢。date
怎麼解決效率的難題呢?答案也正是索引。 合理的利用索引,能夠大幅度的提高數據庫的查詢性能。 關於索引的合理應用,還在研究中。。