在這個資訊量劇增的時代,如何幫助使用者從海量資料中檢索到想要的資料,模糊查詢是必不可少的。那麼在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):在某一範圍內的字元,表示括號內所列字元中的乙個(類似正規表示式)。指定乙個字元、字串或範圍,要求所匹配物件為它們中的任乙個。
例子:
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 中模糊查詢 like
oracle中模糊查詢用like與萬用字元 實現 1 字段 like 關鍵字 字段包含 關鍵字 的記錄 2 字段 like 關鍵字 欄位以 關鍵字 開始的記錄 3 字段 like 關鍵字 欄位以 關鍵字 結束的記錄 如果要找出乙個欄位中既有 關鍵字1 又有 關鍵字2 可以用and條件 如果要找出乙個...
like 模糊查詢
sql 模糊查詢 逗號,在sql中like中不需要轉義,但是如果 在sql中的某個欄位值用 分隔資料,需要獲取資料的時候直接把 拆分成資料,獲得乙個資料的list。例如 需要查詢某欄位是否包含乙個值,111是否存在於1111,2111,1112,1121,1113這個欄位中 因為根據 逗號分開,要求...
like模糊查詢
逗號,在sql中like中不需要轉義,但是如果 在sql中的某個欄位值用 分隔資料,需要獲取資料的時候直接把 拆分成資料,獲得乙個資料的list。例如 需要查詢某欄位是否包含乙個值,111是否存在於1111,2111,1112,1121,1113這個欄位中 因為根據 逗號分開,要求的答案是 不在字段...