溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

oracle中sql正則怎么寫(xiě)

發(fā)布時(shí)間:2023-05-09 15:29:26 來(lái)源:億速云 閱讀:113 作者:zzz 欄目:開(kāi)發(fā)技術(shù)

本篇內(nèi)容介紹了“oracle中sql正則怎么寫(xiě)”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

Oracle中使用正則表達(dá)式需先使用REGEXP_LIKE函數(shù)來(lái)匹配字符串。正則表達(dá)式的語(yǔ)法與一般正則表達(dá)式相似,但具體的寫(xiě)法也受不同版本的Oracle環(huán)境不同。

在Oracle 10g及以下版本中,可以使用POSIX擴(kuò)展來(lái)進(jìn)行正則匹配

如:

^:匹配字符串的開(kāi)始位置;
$:匹配字符串的結(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á)式來(lái)查找符合條件的字符串:

SELECT *
FROM employees
WHERE REGEXP_LIKE(job_title, '^Sales.*Manager$');

上述SQL查詢(xún)會(huì)查找職位名稱(chēng)以“Sales”開(kāi)頭,且以“Manager”結(jié)尾的所有員工數(shù)據(jù)。

Oracle 11g及以上版本

對(duì)于Oracle 11g及以上版本,可以使用更強(qiáng)大的Perl兼容正則表達(dá)式(PCRE)來(lái)進(jìn)行匹配
在使用PCRE時(shí),先需要使用REGEXP_REPLACE函數(shù)中加入&rsquo;c&rsquo;選項(xiàng)進(jìn)行匹配,然后再使用相應(yīng)的正則表達(dá)式來(lái)實(shí)現(xiàn)匹配。

例如,可以使用如下的SQL查詢(xún)來(lái)查找所有包含“John”或“Johnson”的名稱(chēng):

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ù)索引。也就是說(shuō),在使用正則表達(dá)式時(shí),往往無(wú)法使用索引來(lái)優(yōu)化查詢(xún)。

例如,假設(shè)有一個(gè)包含文本的表,其中有一個(gè) text 字段,我們希望查找所有包含“abc”字符的記錄。如果使用 LIKE 操作符,可以這樣寫(xiě):

SELECT * FROM table WHERE text LIKE &lsquo;%abc%&rsquo;;
如果 text 字段上有索引,那么這個(gè)查詢(xún)會(huì)利用索引優(yōu)化執(zhí)行,因?yàn)?LIKE 操作符可以使用前綴索引。但是,如果使用正則表達(dá)式,查詢(xún)語(yǔ)句將變?yōu)椋?/p>

SELECT * FROM table WHERE REGEXP_LIKE(text, &lsquo;abc&rsquo;);
在這種情況下,不能使用索引來(lái)優(yōu)化查詢(xún),因?yàn)?REGEXP_LIKE 函數(shù)需要全文掃描才能找到匹配的記錄。

雖然正則表達(dá)式在某些情況下可能無(wú)法使用索引優(yōu)化,但是可以盡可能地使用模糊查詢(xún)來(lái)代替正則表達(dá)式,從而使用索引來(lái)優(yōu)化查詢(xún)。例如,在上面的例子中,可以使用 LIKE 操作符而不是 REGEXP_LIKE 函數(shù)來(lái)查詢(xún)相同的數(shù)據(jù)。雖然 LIKE 操作符不能使用正則表達(dá)式語(yǔ)法,但是它可以使用前綴索引進(jìn)行優(yōu)化,可以在滿足需求的情況下提高性能。

“oracle中sql正則怎么寫(xiě)”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI