oracle中特殊字符的模糊查詢

oracle中帶有特殊符號的模糊查詢

首先講一下Oracle模糊查詢
Oracle模糊查詢可使用的通配符,Oralce中SQL語句提供了四種匹配模式:
%   零或者多個字符
_    單一任何字符(下劃線)
\     特殊字符
[]     在某一範圍內的字符,如[0-9]或者[aeth] 
[^]    不在某範圍內的字符,如[^0-9]或者[^aeth]
後兩種, 需要Oracle 10g以上使用支持like的正則regexp_like

[ ]:表示括號內所列字符中的一個(類似正則表達式)。
指定一個字符、字符串或範圍,要求所匹配對象爲它們中的任一個
如 [ ] 內有一系列字符(01234、abcde之類的)則可略寫爲“0-4”、“a-e”

[^ ] :表示不在括號所列之內的單個字符。其取值和 [] 相同,但它要求所匹配對象爲指定字符以外的任一個字符。

注:oracle like 不支持正則,你可以使用支持like的正則regexp_like
select * from table_name where regexp_like(name,'[張李王]三');

由於通配符的緣故,導致我們如果想要查詢包括這些特殊字符的內容“%”、“_”、“[”的語句無法正常實現


oracle中的模糊查詢,帶有特殊符號
用like語句查詢的話可以,但是有特殊符號的話不能識別,如:#,%,_ 等

第一種方法:
可以用 regexp_like(字段名 ,'帶有特殊符號的模糊字') 這個查詢
例如:
select * from user_souce t
where to_char(t.us_time, 'yyyymmdd') = '20120615' and regexp_like(t.us_from, 'hello[Mr.hailey]');

 

二種方法:轉義特殊字符,轉義符可以自己定義,用escape '轉義符'定義即可
例如:
-- 查找所有包含'_'的
select * from emp where ename like '%?_%' escape '?';  --轉義符爲問號?
select * from emp where ename like '%/_' escape '/';   --轉義符爲斜槓/
--查找所有以_結尾的
select * from emp where ename like '%\_' escape '\'; --轉義符爲反斜槓\

 

同理,通過這種方法查找含有'%'的所有字段
select * from emp where ename like '%\%%' escape '\';

 

是'&'不能通過轉義字符查找
如果按上面的寫法,
select * from emp where ename like '%\&' escape '\'; 
會提示:ORA-01424: 轉義符之後字符缺失或非法
可以通過另外的方式進行轉義:
select ascii('&') from dual;
ASCII('&')
----------
        38
select * from emp where ename like '%' || chr(38) || '%';

 

在oracle中chr()函數和ascii()是一對反函數
chr()函數將ASCII碼轉換爲字符:ASCII碼 --> 字符
ascii('字符')函數獲得該字符的ascii碼值,將字符轉換爲ASCII碼:字符 --> ASCII碼

 

但是,注意%不能用這種方法轉義(%號的ascii碼爲37)因爲轉出來還是一個%號,還是會當做通配符找出所有的數據

 

--單引號的轉義
如果按上面的寫法,
select * from emp where ename like '%\'%'  escape '\';
會提示:ORA-01756:引號內的字符串沒有正確結束,因爲不能正確識別結束
--查找所有含有單引號的名字
select * from emp where ename like '%''%';

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章