SQL正規表示式

2021-08-26 10:25:25 字數 3983 閱讀 4744

當我們要進行一些簡單的糊塗查詢時用百分號(%),萬用字元(_)就可以了.其中%表達任意長度的字串,_表示任意的某乙個字元.

比如select * from emp where ename like 's%' or ename like 's_';

但如果在一些複雜的查詢中關用這兩個符號sql語句就會非常複雜,而且也不一定能實現.從oracle 10g開始引入了在其他程式語言中普通使用的正規表示式.

主要有regexp_like,regexp_replace,regexp_substr,regexp_instr四個正規表示式函式.

元字元

意思

例子

\

說明要匹配的字元是乙個特殊字元、常量或者後者引用。(後引用重複上一次的匹配)

\n 匹配換行符

\\ 匹配 \

\( 匹配 (

\) 匹配 )

^匹配字串的開頭位置

^a匹配arwen.但不匹配barwen.

$

匹配字串的末尾位置

en$匹配arwen.但不匹配arwenb.

*

匹配前面的字元0次或多次

a*rwen可以匹配rwen或aaarwen.

+匹配前面的字元1次或多次

a+rwen可以匹配arwen或aarwen.但不能匹配rwen.

?匹配前面的字元0次或1次

a?rwen可以匹配arwen或rwen.但不能匹配aarwen.

匹配前面的字元恰好是n次,其中n是整數

arwen可以匹配arrwen.但不能匹配arwen或arrrwen.

匹配前面的字元至少是n次,最多是m次.如果寫成

表示最少匹配n次.沒有上限.

arwen可以匹配arwen,arrwen.但不匹配awen或arrrwen.

.點號,匹配除null,換行以外的任意單個字元

arw.n.可以匹配arwen,arwin.但不能匹配arween或arwn.

(pattern)

括號中pattern是乙個子正規表示式,匹配指定pattern模式的乙個子表示式。

其實括號就像一般語言表示式中的括號.有時多加些括號可增強可讀性.另外的用處見下面關於\n的描述.

x|y匹配「或」

x|y可以匹配x或者y

[abc]

可以匹配abc中的任何單個字元

hello[abc]可以匹配helloa,hellob,helloc

[a-z]

可以匹配指定範圍內的任何單個字元

hell[a-z]可以匹配hello或者hellz

[::]

指定乙個字元類,可以匹配該類中的任何字元

[:alphanum:]可以匹配字元0-9、a-z、a-z

[:alpha:]可以匹配字元a-z、a-z

[:blank:]可以匹配空格或tab鍵

[:digit:]可以匹配數字0-9

[:graph:]可以匹配非空字元

[:lower:]可以匹配小寫字母a-z

[:print:]與[:graph:]類似,不同之處在於[:print:]包括空格字元

[:punct:]可以匹配標點符號.,""等等

[:space:]可以匹配所有的空字元

[:upper:]可以匹配大寫字母a-z

[:xdigit:]可以匹配十六進製制數字0-9、a-f、a-f

\n這是對前一次匹配命中的乙個後引用,其中n是乙個正整數

arw(en)\1可以匹配arwenen.注意\1前面必須是個加括號的子表示式.

regexp_like(x,pattern[,match_option]),檢視x是否與pattern相匹配,該函式還可以提供乙個可選的引數match_option字串說明預設的匹配選項。match_option的取值如下:

『c』 說明在進行匹配時區分大小寫(預設值);

'i' 說明在進行匹配時不區分大小寫;

'n'(.)點號能表示所有單個字元,包括換行(俺還不知道什麼地方有用到換行.只知道sql裡面可以用chr(10)表示換行.

'm' 字串存在換行的時候當作多行處理.這樣$就可匹配每行的結尾.不然的話$只匹配字串最後的位置.

示例:select * from emp where regexp_like(ename,'^a[a-z]*n$');可以查詢ename中以a開頭以n結尾的行.例如ename為arwen或arwin或anden.但arwen不能被匹配.因為預設是區分大小寫.如果是select * from emp where regexp_like(ename,'^a[a-z]*n$','i')則可以查詢ename為arwen的行記錄.

regexp_instr(x,pattern[,start[,occurrence[,return_option[, match_option]]]])用於在x中查詢pattern。返回pattern在x中出現的位置。匹配位置從1開始。可以參考字串函式 instr(),引數相關:

'start' 開始查詢的位置;

'occurrence' 說明應該返回第幾次出現pattern的位置;

'return_option' 說明應該返回什麼整數。若該引數為0,則說明要返回的整數是x中的乙個字元的位置;若該引數為非0的整數,則說明要返回的整數為x中出現在pattern之後 的字元的位置;

'match_option' 修改預設的匹配設定.與regexp_like裡面的相同.

示例:declare

v_result integer ;

begin

select regexp_instr('hello world','o',1,1,0)into v_result

from dual;

dbms_output.put_line(v_result);

end;

結果為5.即字母o第乙個次出現的位置

如果regexp_instr('hello world','o',1,1,n)其中n為除0之外的整數.比如1,3.則結果為6.表示第一次出現字母o的後面乙個字元的位置.

如果regexp_instr('hello world','o',1,2,0)則結果為9.表示第二次出現字母o的位置.

regexp_replace(x,pattern[,replace_string[,start[,occurrence[, match_option]]]])用於在x中查詢pattern,並將其替換為replae_string。可以參考字串函式 replace(),引數同regexp_instr函式

示例:declare

v_result varchar2(90);

begin

select regexp_replace('hello world','o','x',1,1)into v_result

from dual;

dbms_output.put_line(v_result);

end;

結果為hellx world.

如果regexp_replace('hello world','o','x'),則結果為hellx wxrld.

如果 regexp_replace('hello world','o','x',1,2)則結果為hello wxrld.

regexp_substr(x,pattern[,start[,occurrence[, match_option]]])用於在x中查詢pattern並返回。可以參考字串函式 substr(),引數同regexp_instr函式.

例如:declare

v_result varchar2(255);

begin

select regexp_substr('hello world','l')into v_result

from dual;

dbms_output.put_line(v_result);

end ;

結果為ll

查詢到匹配的字串才返回匹配的字元.沒查到就返回空.

sql正規表示式 SQL中的正規表示式

sql正規表示式 sql中的正規表示式 sql的查詢語句中,有時會需要引進正規表示式為其複雜搜尋指定模式。下面給出一些 regexp 在mysql 語句中應用 非全部 1 匹配字串的開始部分。mysql select fo nfo regexp fo 0mysql select fofo regex...

SQL 正規表示式

由mysql提供的模式匹配的其他型別是使用擴充套件正規表示式。當你對這類模式進行匹配測試時,使用regexp和not regexp操作符 或rlike和not rlike,它們是同義詞 擴充套件正規表示式的一些字元是 匹配任何單個的字元。乙個字元類 匹配在方括號內的任何字元。例如,abc 匹配 a ...

SQL正規表示式

例子 1 查詢名字包含 天 字的人的資訊 select from user where user name like 天 等同於 select from user where user name regexp 天 2 查詢user表中,姓名最後乙個字是 宇 的人的資訊 select from use...