oracle中sql 正則寫法詳解
Oracle中使用正則表達(dá)式需先使用REGEXP_LIKE函數(shù)來匹配字符串。正則表達(dá)式的語(yǔ)法與一般正則表達(dá)式相似,但具體的寫法也受不同版本的Oracle環(huán)境不同。
在Oracle 10g及以下版本中,可以使用POSIX擴(kuò)展來進(jìn)行正則匹配
如:
^:匹配字符串的開始位置;
$:匹配字符串的結(jié)束位置;
.:匹配任何單個(gè)字符;
[ ]:匹配指定集合內(nèi)的任何字符,如[abc]匹配a、b、c中任意一個(gè)字符;
[^ ]:匹配不在指定集合內(nèi)的任何字符,如[^abc]匹配除a、b、c之外的任意字符;
*:匹配前面的子表達(dá)式零次或多次;
+:匹配前面的子表達(dá)式一次或多次;
?:匹配前面的子表達(dá)式零次或一次;
{n}:n為非負(fù)整數(shù),匹配恰好n次;
{n,}:n為非負(fù)整數(shù),匹配至少n次;
{n,m}:n和m為非負(fù)整數(shù)且n<=m,匹配至少n次且至多m次。
例如,可以使用REGEXP_LIKE函數(shù)配合正則表達(dá)式來查找符合條件的字符串:
SELECT * FROM employees WHERE REGEXP_LIKE(job_title, '^Sales.*Manager$');
上述SQL查詢會(huì)查找職位名稱以“Sales”開頭,且以“Manager”結(jié)尾的所有員工數(shù)據(jù)。
Oracle 11g及以上版本
對(duì)于Oracle 11g及以上版本,可以使用更強(qiáng)大的Perl兼容正則表達(dá)式(PCRE)來進(jìn)行匹配
在使用PCRE時(shí),先需要使用REGEXP_REPLACE函數(shù)中加入’c’選項(xiàng)進(jìn)行匹配,然后再使用相應(yīng)的正則表達(dá)式來實(shí)現(xiàn)匹配。
例如,可以使用如下的SQL查詢來查找所有包含“John”或“Johnson”的名稱:
SELECT * FROM employees WHERE REGEXP_REPLACE(name, '(John|Johnson)', '*', 1, 0, 'c') != name;
我的實(shí)際例子:
SELECT * --DISTINCT CODE,count(1) FROM table WHERE 1 = 1 AND DATA_CATE = 'CPAU' --AND ext_5 LIKE 'ASSM%' AND REGEXP_REPLACE(ext_5, '(ASSM01|PSVA0100)', '*', 1, 0, 'c') != ext_5; AND VALID_FLG = 'Y'
是否走索引
正則表達(dá)式的匹配通常需要對(duì)目標(biāo)字符串全文掃描,因此,在大多數(shù)情況下,使用正則表達(dá)式無(wú)法利用數(shù)據(jù)庫(kù)索引。也就是說,在使用正則表達(dá)式時(shí),往往無(wú)法使用索引來優(yōu)化查詢。
例如,假設(shè)有一個(gè)包含文本的表,其中有一個(gè) text 字段,我們希望查找所有包含“abc”字符的記錄。如果使用 LIKE 操作符,可以這樣寫:
SELECT * FROM table WHERE text LIKE ‘%abc%’;
如果 text 字段上有索引,那么這個(gè)查詢會(huì)利用索引優(yōu)化執(zhí)行,因?yàn)?LIKE 操作符可以使用前綴索引。但是,如果使用正則表達(dá)式,查詢語(yǔ)句將變?yōu)椋?/p>
SELECT * FROM table WHERE REGEXP_LIKE(text, ‘abc’);
在這種情況下,不能使用索引來優(yōu)化查詢,因?yàn)?REGEXP_LIKE 函數(shù)需要全文掃描才能找到匹配的記錄。
雖然正則表達(dá)式在某些情況下可能無(wú)法使用索引優(yōu)化,但是可以盡可能地使用模糊查詢來代替正則表達(dá)式,從而使用索引來優(yōu)化查詢。例如,在上面的例子中,可以使用 LIKE 操作符而不是 REGEXP_LIKE 函數(shù)來查詢相同的數(shù)據(jù)。雖然 LIKE 操作符不能使用正則表達(dá)式語(yǔ)法,但是它可以使用前綴索引進(jìn)行優(yōu)化,可以在滿足需求的情況下提高性能。
到此這篇關(guān)于oracle中sql 正則怎么寫的文章就介紹到這了,更多相關(guān)oracle sql 正則內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
oracle定時(shí)任務(wù)定時(shí)無(wú)效的原因分析與解決
發(fā)現(xiàn)系統(tǒng)數(shù)據(jù)沒有更新,查看oracle定時(shí)任務(wù),估計(jì)沒有執(zhí)行,下面這篇文章主要給大家介紹了關(guān)于oracle定時(shí)任務(wù)定時(shí)無(wú)效的原因分析與解決方法,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-06-06
項(xiàng)目適?Oracle改造及SSL安全性配置問題匯總詳解
這篇文章主要為大家介紹了項(xiàng)目適?Oracle改造及SSL安全性配置問題匯總詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09
Oracle中執(zhí)行動(dòng)態(tài)SQL
這篇文章介紹了Oracle中執(zhí)行動(dòng)態(tài)SQL的方法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-05-05
ORACLE11g隨RHEL5系統(tǒng)自動(dòng)啟動(dòng)與關(guān)閉的設(shè)置方法
最近,ORACLE系統(tǒng)基本調(diào)試通過,是時(shí)候設(shè)置ORACLE隨RHEL自動(dòng)啟動(dòng)與關(guān)閉服務(wù)的時(shí)候了,之所以把這個(gè)任務(wù)放在最后來做,是因?yàn)槲矣X得這個(gè)應(yīng)該不會(huì)很難,但真正實(shí)施起來,還是遇到了個(gè)不小的障礙2009-08-08
Oracle 中 table 函數(shù)的應(yīng)用淺析
表函數(shù)可接受查詢語(yǔ)句或游標(biāo)作為輸入?yún)?shù),并可輸出多行數(shù)據(jù)。這篇文章主要介紹了Oracle 中 table 函數(shù)的應(yīng)用淺析,需要的朋友可以參考下2016-12-12
Oracle數(shù)據(jù)庫(kù)性能優(yōu)化技術(shù)開發(fā)者網(wǎng)絡(luò)Oracle
Oracle數(shù)據(jù)庫(kù)性能優(yōu)化技術(shù)開發(fā)者網(wǎng)絡(luò)Oracle...2007-03-03

