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

2021-07-25 10:37:31 字數 4386 閱讀 5102

首先講一下oracle模糊查詢,模糊查詢使用的是like關鍵字

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,'[張李王]三');
查詢name值為張三,李三,王三的記錄,及[張李王]其中乙個字元和'三'匹配;

--建立測試表:

create table liketesttable

( id number not null,

name varchar2(100),

content clob,

title varchar2(200),

forms varchar2(200)

)

--插入測試資料:

insert into liketesttable (id, name, content, title, forms)

values (1, '張三', '', '明天_天氣不錯', 'hello#ggg');

insert into liketesttable (id, name, content, title, forms)

values (2, '王三', '', '明天_天氣不錯', 'hello*ffdd');

insert into liketesttable (id, name, content, title, forms)

values (3, '李三', '', '明天_天氣不錯', 'hello$ddd');

insert into liketesttable (id, name, content, title, forms)

values (4, '李四', '', '明天_天氣不錯', 'hello@ddd');

insert into liketesttable (id, name, content, title, forms)

values (6, '王八', '', '明天_天氣不錯', 'hello_ggg');

insert into liketesttable (id, name, content, title, forms)

values (7, '舅舅', '', '明天_天氣不錯', 'hello_ffffff');

insert into liketesttable (id, name, content, title, forms)

values (5, '王五', '', '明天_天氣不錯', 'hello~ddd');

注意clob是大字段,這裡顯示不出來,真實資料自己新增;

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

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

第一種方法:

可以用 regexp_like(欄位名 ,'帶有特殊符號的模糊字') 這個查詢

例如:

select * from liketesttable where regexp_like(forms,'hello[_]')
輸出結果:

id	name	content	title	        forms

1 6 王八 明天_天氣不錯 hello_ggg

2 7 舅舅 明天_天氣不錯 hello_ffffff

hello[_]就是我們輸入的引數,它會查詢和name中值匹配的資料記錄,hello[_]中包含了特殊的字元「#」;

如果是使用普通的模糊查詢:

select *from liketesttable where forms like 'hello_%'

輸出結果:

id	name  content	title	        forms

1 1 張三 明天_天氣不錯 hello#ggg

2 2 王三 明天_天氣不錯 hello*ffdd

3 3 李三 明天_天氣不錯 hello$ddd

4 4 李四 明天_天氣不錯 hello@ddd

5 6 王八 明天_天氣不錯 hello_ggg

6 7 舅舅 明天_天氣不錯 hello_ffffff

7 5 王五 明天_天氣不錯 hello~ddd

因為「_」與(萬用字元「_」代表乙個字元)衝突了,所以hello_%查出了所以結果;

第二種方法:轉義特殊字元,轉義符可以自己定義,用(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 '\';

改寫第一種查詢方法:sql:

select * from liketesttable where forms like '%\_%' escape '\';
輸出結果:
id	name	content	title	        forms

1 6 王八 明天_天氣不錯 hello_ggg

2 7 舅舅 明天_天氣不錯 hello_ffffff

但是'&'不能通過轉義字元查詢

如果按上面的寫法,

select * from liketesttable where forms like 'hello\&%' escape '\';

可以通過另外的方式進行轉義:

select

ascii('&') from dual;

ascii('&')

----------

正確寫法:

select *from liketesttable where forms like 'hello'|| chr(38) ||'%'

在oracle中chr()函式和ascii()是一對反函式

chr()函式將ascii碼轉換為字元:ascii碼 --> 字元

ascii('字元')函式獲得該字元的ascii碼值,將字元轉換為ascii碼:字元 --> ascii碼

但是,注意%不能用這種方法轉義(%號的ascii碼為37)因為轉出來還是乙個%號,還是會當做萬用字元找出所有的資料;

--單引號的轉義

如果按上面的寫法,

select * from liketesttable where forms like 'hello\'%' escape '\';

--查詢所有含有單引號的名字

select *from liketesttable where forms like 'hello''%'

單引號的轉義可以參考:

附:轉義和不轉義:

轉義:like 'db\_design'-->查的是'db_design'這個字串,只有這個符合;

不轉義:like 'db_design'-->查的是所有符合'db_design'的字串「_」代表乙個字元,可以是任意的字元,例如'dbfdesign','dbhdesign','dbydesign'都符合;

轉義就是將特殊的字元變成乙個普通的字元;

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

oracle中帶有特殊符號的模糊查詢 oracle中帶有特殊符號的模糊查詢 首先講一下oracle模糊查詢 oracle模糊查詢可使用的萬用字元,oralce中sql語句提供了四種匹配模式 零或者多個字元 單一任何字元 下劃線 特殊字元 在某一範圍內的字元,如 0 9 或者 aeth 不在某範圍內的...

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

oracle中帶有特殊符號的模糊查詢 首先講一下oracle模糊查詢 oracle模糊查詢可使用的萬用字元,oralce中sql語句提供了四種匹配模式 零或者多個字元 單一任何字元 下劃線 特殊字元 在某一範圍內的字元,如 0 9 或者 aeth 不在某範圍內的字元,如 0 9 或者 aeth 後兩...

ORACLE中的模糊查詢

oracle中的模糊查詢是靠like操作符來完成的。現在我們來看一下like操作符使用過程中的一些具體的問題 代表0個或者多個字元 下劃線 代表乙個字元 比如 1 select ename from emp where ename like s 上面這個例子查詢出的是以大寫s為名字首字母的員工的員工...