国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
oracle PL/SQL使用更方便了——Oracle10g的SQL正則表達(dá)式支持[天源迪科論壇]
oracle PL/SQL使用更方便了——Oracle10g的SQL正則表達(dá)式支持

Oracle10g的SQL正則表達(dá)式支持。
Oracle 8 和Oracle 9i中缺乏靈活性的SQL 正則表達(dá)式最終在Oracle 10g中得到了解決。Oracle 數(shù)據(jù)庫目前內(nèi)建了符合POSIX 標(biāo)準(zhǔn)的正則表達(dá)式。
四個(gè)新的函數(shù)分別是:REGEXP_LIKE、REGEXP_INSTR、REGEXP_SUBSTR、和REGEXP_REPLACE。它們在用法上與Oracle SQL 函數(shù)LIKE、INSTR、SUBSTR 和REPLACE用法,但是它們使用POSIX 正則表達(dá)式代替了老的百分號(%)和通配符(_)字符。
POSIX 正則表達(dá)式由標(biāo)準(zhǔn)的元字符(metacharacters)所構(gòu)成:
 ‘^‘ 表示字符串的開始
 ‘ $‘ 表示字符串的結(jié)束?
 ‘.‘ 表示任何字符
 字符的范圍,比如說‘[a-z]‘,表示任何ASCII 小寫字母,與字符類"[[:lower:]]"" 等價(jià)
 ‘?‘ 允許一個(gè)后繼字符匹配零次或一次
 ‘ ‘ 允許一個(gè)后繼字符匹配一次或多次
 ‘*‘ 表示零次或多次
可以使用"{m,n}" 指定一個(gè)精確地出現(xiàn)范圍,其意思是“出現(xiàn)從m 次到n 次”;"{m}" 表示“正好m次”;而"{m,}"表示“至少m次”。還可以使用圓括號組合字符的集合,使用"|"(豎線)表示可替換。例如,字符串‘^([a-z] |[0-9]$‘將匹配所有由小寫字母或數(shù)字組合成的字符串。?)
REGEXP_LIKE 與LIKE操作符相似。如果第一個(gè)參數(shù)匹配正則表達(dá)式它就解析為TRUE。例如WHERE REGEXP_LIKE(ENAME,‘^J[AO]‘,‘i‘)將在ENAME 以JA 或JO 開始的情況下返回一行數(shù)據(jù)。‘I‘ 參數(shù)指定正則表達(dá)式是大小寫敏感的。另外還可以在CHECK約束和函數(shù)索引中指定REGEXP_LIKE。例如:
ALTER TABLE EMP ADD CONSTRAINT REGEX01

CHECK $‘));?(REGEXP_LIKE(ENAME,‘^[[:alpha:]] 
這條語句使得ENAME 字段只能包含字母和數(shù)字字符(也就是說沒有空格或者標(biāo)點(diǎn)符號)。試圖插入或者更新這些數(shù)據(jù)將導(dǎo)致一個(gè)ORA-2290 異常,或者檢查約束的有效性。
REGEXP_INSTR 與INSTR 函數(shù)類似。它返回一個(gè)字符串中匹配一個(gè)正則表達(dá)式的第一個(gè)子串的開始位置。例如:
$[[:digit:]]?$400 for your purchase.‘,‘?SELECT REGEXP_INSTR(‘The total is  ‘)

FROM DUAL;
$400在字符串的開始位置。另外還可以指定子串出現(xiàn)的次數(shù);開始搜索的位置;是返回匹配的位置還是返回匹配之后字符的位置。?這個(gè)查詢返回14,即
REGEXP_SUBSTR 返回匹配一個(gè)正則表達(dá)式的子串。雖然結(jié)合使用SUBSTR 和REGEXP_INSTR 及LENGTH 也可以實(shí)現(xiàn)這一功能,但是使用這個(gè)函數(shù)卻更為簡單。
SELECT REGEXP_INSTR(‘one,two,three‘,‘[^,]*‘) FROM DUAL;
這個(gè)查詢返回‘one‘,將第一個(gè)參數(shù)看成一個(gè)逗號分隔的列表并返回第一個(gè)逗號之前的所有字符。
REGEXP_REPLACE 返回初始參數(shù)被匹配子串替換之后的結(jié)果。例如:
SELECT REGEXP_REPLACE(‘The temperature is 23°F‘,

‘([[:digit:]]) °F‘,

(‘\1‘-32)*5/9||‘°C‘)

FROM DUAL;
這個(gè)查詢將查找一個(gè)華氏溫度并將其轉(zhuǎn)換為攝氏度。它將返回:‘The temperature is -5°C‘。

   在進(jìn)行查詢時(shí),有時(shí)候需要按照一定的特殊規(guī)則來查找某個(gè)字符串,比如,你可能需要查詢第三位為5-8,最后四位為’8888’的所有電話。在9i之前,你可能需要寫一個(gè)很復(fù)雜的條件:
Select username from t_userinfo
where (phonenumber like ‘135%8888’
or phonenumber like ‘136%8888’
or phonenumber like ‘137%8888’
or phonenumber like ‘138%8888’)
and length(phonenumber) = 13;
   那時(shí)就會很羨慕j(luò)ava程序員可以使用一個(gè)正則表達(dá)式輕松搞定。10g中,再也不需要這么復(fù)雜了,oracle也提供了幾個(gè)正則表達(dá)式函數(shù),大大方便了開發(fā)人員:REGEXP_LIKE、REGEXP_REPLACE、REGEXP_INSTR、REGEXP_SUBSTR,分別用于模糊匹配、代替、插入、截取字符串。關(guān)于正則表達(dá)式的規(guī)則這就不詳細(xì)描述了,可以查相關(guān)資料得到。簡單舉例。以上面例子為例,我們的查詢語句可以寫成:
SQL> create table t_userinfo (username varchar2(10), phonenumber varchar2(13));
Table created
SQL> insert into t_userinfo values (‘zhansan‘, ‘13012323434‘);
1 row inserted
SQL> insert into t_userinfo values (‘lisi‘, ‘13512348888‘);
1 row inserted
SQL> insert into t_userinfo values (‘wangwu‘, ‘13912328888‘);
1 row inserted
SQL> insert into t_userinfo values (‘zhaoliu‘, ‘13743218888‘);
1 row inserted
SQL> insert into t_userinfo values (‘sunqi‘, ‘1361234888‘);
1 row inserted
SQL> commit;
Commit complete
SQL> Select username, phonenumber from t_userinfo
2 where REGEXP_LIKE(phonenumber, ‘13[5-8][0-9][0-9][0-9][0-9]8{4}‘);
USERNAME   PHONENUMBER
---------- -------------
lisi       13512348888
zhaoliu    13743218888


Oracle 10g正則表達(dá)式提高了SQL靈活性。有效的解決了數(shù)據(jù)有效性, 重復(fù)詞的辨認(rèn), 無關(guān)的空白檢測,或者分解多個(gè)正則組成
的字符串等問題。

Oracle 10g支持正則表達(dá)式的四個(gè)新函數(shù)分別是:REGEXP_LIKE、REGEXP_INSTR、REGEXP_SUBSTR、和REGEXP_REPLACE。
它們使用POSIX 正則表達(dá)式代替了老的百分號(%)和通配符(_)字符。

特殊字符:
‘^‘ 匹配輸入字符串的開始位置,在方括號表達(dá)式中使用,此時(shí)它表示不接受該字符集合。
‘$‘ 匹配輸入字符串的結(jié)尾位置。如果設(shè)置了 RegExp 對象的 Multiline 屬性,則 $ 也匹配 ‘n‘ 或 ‘r‘。
‘.‘ 匹配除換行符 n之外的任何單字符。
‘?‘ 匹配前面的子表達(dá)式零次或一次。
‘*‘ 匹配前面的子表達(dá)式零次或多次。
‘+‘ 匹配前面的子表達(dá)式一次或多次。
‘( )‘ 標(biāo)記一個(gè)子表達(dá)式的開始和結(jié)束位置。
‘[]‘ 標(biāo)記一個(gè)中括號表達(dá)式。
‘{m,n}‘ 一個(gè)精確地出現(xiàn)次數(shù)范圍,m=<出現(xiàn)次數(shù)<=n,‘{m}‘表示出現(xiàn)m次,‘{m,}‘表示至少出現(xiàn)m次。
‘|‘ 指明兩項(xiàng)之間的一個(gè)選擇。例子‘^([a-z]+|[0-9]+)$‘表示所有小寫字母或數(shù)字組合成的字符串。
num 匹配 num,其中 num 是一個(gè)正整數(shù)。對所獲取的匹配的引用。
正則表達(dá)式的一個(gè)很有用的特點(diǎn)是可以保存子表達(dá)式以后使用, 被稱為Backreferencing. 允許復(fù)雜的替換能力
如調(diào)整一個(gè)模式到新的位置或者指示被代替的字符或者單詞的位置. 被匹配的子表達(dá)式存儲在臨時(shí)緩沖區(qū)中,
緩沖區(qū)從左到右編號, 通過數(shù)字符號訪問。 下面的例子列出了把名字 aa bb cc 變成
cc, bb, aa.
Select REGEXP_REPLACE(‘a(chǎn)a bb cc‘,‘(.*) (.*) (.*)‘, ‘3, 2, 1‘) FROM dual;
REGEXP_REPLACE(‘ELLENHILDISMIT
cc, bb, aa
‘‘ 轉(zhuǎn)義符。

字符簇:
[[:alpha:]] 任何字母。
[[:digit:]] 任何數(shù)字。
[[:alnum:]] 任何字母和數(shù)字。
[[:space:]] 任何白字符。
[[:upper:]] 任何大寫字母。
[[:lower:]] 任何小寫字母。
[[:punct:]] 任何標(biāo)點(diǎn)符號。
[[:xdigit:]] 任何16進(jìn)制的數(shù)字,相當(dāng)于[0-9a-fA-F]。

各種操作符的運(yùn)算優(yōu)先級
轉(zhuǎn)義符
(), (?:), (?=), [] 圓括號和方括號
*, +, ?, {n}, {n,}, {n,m} 限定符
^, $, anymetacharacter 位置和順序
| “或”操作

--測試數(shù)據(jù)
create table test(mc varchar2(60));

insert into test values(‘112233445566778899‘);
insert into test values(‘22113344 5566778899‘);
insert into test values(‘33112244 5566778899‘);
insert into test values(‘44112233 5566 778899‘);
insert into test values(‘5511 2233 4466778899‘);
insert into test values(‘661122334455778899‘);
insert into test values(‘771122334455668899‘);
insert into test values(‘881122334455667799‘);
insert into test values(‘991122334455667788‘);
insert into test values(‘a(chǎn)abbccddee‘);
insert into test values(‘bbaaaccddee‘);
insert into test values(‘ccabbddee‘);
insert into test values(‘ddaabbccee‘);
insert into test values(‘eeaabbccdd‘);
insert into test values(‘a(chǎn)b123‘);
insert into test values(‘123xy‘);
insert into test values(‘007ab‘);
insert into test values(‘a(chǎn)bcxy‘);
insert into test values(‘The final test is is is how to find duplicate words.‘);

commit;

一、REGEXP_LIKE

select * from test where regexp_like(mc,‘^a{1,3}‘);
select * from test where regexp_like(mc,‘a(chǎn){1,3}‘);
select * from test where regexp_like(mc,‘^a.*e$‘);
select * from test where regexp_like(mc,‘^[[:lower:]]|[[:digit:]]‘);
select * from test where regexp_like(mc,‘^[[:lower:]]‘);
Select mc FROM test Where REGEXP_LIKE(mc,‘[^[:digit:]]‘);
Select mc FROM test Where REGEXP_LIKE(mc,‘^[^[:digit:]]‘);

二、REGEXP_INSTR

Select REGEXP_INSTR(mc,‘[[:digit:]]$‘) from test;
Select REGEXP_INSTR(mc,‘[[:digit:]]+$‘) from test;
Select REGEXP_INSTR(‘The price is $400.‘,‘$[[:digit:]]+‘) FROM DUAL;
Select REGEXP_INSTR(‘onetwothree‘,‘[^[[:lower:]]]‘) FROM DUAL;
Select REGEXP_INSTR(‘,,,,,‘,‘[^,]*‘) FROM DUAL;
Select REGEXP_INSTR(‘,,,,,‘,‘[^,]‘) FROM DUAL;

三、REGEXP_SUBSTR

SELECT REGEXP_SUBSTR(mc,‘[a-z]+‘) FROM test;
SELECT REGEXP_SUBSTR(mc,‘[0-9]+‘) FROM test;
SELECT REGEXP_SUBSTR(‘a(chǎn)ababcde‘,‘^a.*b‘) FROM DUAL;

四、REGEXP_REPLACE

Select REGEXP_REPLACE(‘Joe Smith‘,‘( ){2,}‘, ‘,‘) AS RX_REPLACE FROM dual;
Select REGEXP_REPLACE(‘a(chǎn)a bb cc‘,‘(.*) (.*) (.*)‘, ‘3, 2, 1‘) FROM dual;

SQL> select * from test;

ID MC
-------------------- ------------------------------------------------------------
A AAAAA
a aaaaa
B BBBBB
b bbbbb

SQL> select * from test where regexp_like(id,‘b‘,‘i‘); --不區(qū)分?jǐn)?shù)據(jù)大小寫

ID MC
-------------------- ------------------------------------------------------------
B BBBBB
b bbbbb

#End

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
oracle中通過正則表達(dá)式函數(shù)處理逗號分隔的字段
oracle正則表達(dá)式regexp
Oracle中的正則表達(dá)式(及函數(shù))詳解
Oracle正則表達(dá)式規(guī)則
Oracle 正則表達(dá)式
在 Oracle 中使用正則表達(dá)式
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服