在oracle中使用萬用字元查詢時,發現在萬用字元中帶有[ ]表示範圍時相應資料無法顯示,但不會報錯,假如我想查詢名字中帶有字母o的人,以下兩條語句的作用是一樣的:
select * from employees_copy t where t.first_name not
like
'%o%';
select * from employees_copy t where t.first_name like
'%[^o]%';
第一條語句可以查到結果,但是第二條卻無法查出任何記錄,後來測試了以下發現但凡萬用字元中帶有[ ]範圍限定的在oracle中均無法查出相關記錄,查了下資料發現其他人也有這樣的問題,後來嘗試了下使用正規表示式regexp_like代替like的形式,可以查出結果來,測試**如下:
select * from employees_copy t where regexp_like(t.first_name,'^[m-o]');
--以m,n或o開頭
select * from employees_copy t where regexp_like(t.first_name,'^[^m-o]');
--不以m,n或o開頭
select * from employees_copy t where regexp_like(t.first_name,'[m-o]$');
--以m,n或o結尾
select * from employees_copy t where regexp_like(t.first_name,'[^m-o]$');
--不以m,n或o結尾
posix 正規表示式由標準的元字元(metacharacters)所構成:
'^' 匹配輸入字串的開始位置,在方括號表示式中使用,此時它表示不接受該字元集合。
'$' 匹配輸入字串的結尾位置。如果設定了 regexp 物件的 multiline 屬性,則 $ 也匹配 '\n' 或 '\r'。
根據測試,我的理解是:
『^』放在[ ]裡面表示的是否定,即表示需查詢的結果不包含方括號中的這些字元,若放在[ ]的前面則表示開頭,即需查詢的結果要以方括號中的這些字元開頭,且』^』不能單獨作為否定符號放在方括號裡面(?,如下面這種形式);
select * from employees_copy t where regexp_like(t.first_name,'[^mgi]') ;
』$『若放在[ ]中則與其他字母一樣都是表示範圍,若放在[ ]的後面則表示結尾,即需查詢的結果要以方括號中的這些字元結束。
但當兩者同時放在開頭和結尾時,需要注意它所表達的含義:
^abc$ 只匹配單行的abc,不能匹配abcd
^[abc]$ 只匹配a或b或c
^[abc][123]$ 只匹配a1或a2或a3或b1或b2或b3或c1或c2或c3
^[abc]$ 只匹配aa或ab或ac或ba或bb或bc或ca或cb或cc
select * from employees_copy t where regexp_like(t.first_name,'^[m-o]$');
--測試未成功
後來有人告訴我這樣的寫法也是可以查出來的:
--查詢姓名裡包含字母o的人
select * from employees_copy where regexp_like(first_name,'[,o]+');
--查詢姓名裡不包含字母o的人
select * from employees_copy where
not regexp_like(first_name,'[,o]+');
在oracle中若要寫帶有[ ] 表示範圍的模糊查詢語句只能使用正規表示式或是放棄方括號的使用直接用not like或like
但是後面的』[,o]+』的寫法是遵從什麼規則的呢?
資料庫 Oracle中的萬用字元
oracle在where子句中,可以對datetime char varchar欄位型別的列用like子句配合萬用字元選取那些 很像.的資料記錄,以下是可使用的萬用字元 零或者多個字元 單一任何字元 下劃線 特殊字元 oracle10g以上支援正規表示式的函式主要有下面四個 1,regexp lik...
資料庫萬用字元
1 like mc 將搜尋以字母 mc 開頭的所有字串 如 mcbadden 2 like inger 將搜尋以字母 inger 結尾的所有字串 如 ringer stringer 3 like en 將搜尋在任何位置包含字母 en 的所有字串 如 bennet green mcbadden 4 l...
Oracle資料庫萬用字元 列拼接計算
萬用字元 代表任意乙個字元,字元個數的取值範圍 代表任意多個字元,字元個數的取值範圍 0 n 平時應用最多 escape 定義轉移字元列拼接計算 將查詢結果中的多個列拼接成一列 1.標準sql的做法 concat concat a.pid,a.pname a.pnumber 只能寫兩個引數 iso標...