3 回答

TA貢獻(xiàn)2019條經(jīng)驗(yàn) 獲得超9個(gè)贊
Oracle中的Like操作符使用'_'和'%'作為通配符,使用就像這樣:
即匹配test_like表name列中第2個(gè)字母是a的所有行。但是注意,Oracle匹配時(shí)區(qū)分大小寫的。也就是說(shuō)上面的查詢時(shí)無(wú)法查詢到name='SAas'這行的。
Oracle10g中提供的正則表達(dá)式功能可以很好的解決這個(gè)問(wèn)題,當(dāng)然這不是使用正則表達(dá)式函數(shù)的唯一優(yōu)點(diǎn),實(shí)際上它比Like操作符強(qiáng)大的多。
正則表達(dá)式的語(yǔ)法就不用多說(shuō)了,現(xiàn)在大多數(shù)語(yǔ)言都支持正則表達(dá)式了。
下面主要介紹下Oracle中正表達(dá)式函數(shù)REGEXP_LIKE的使用:
REGEXP_LIKE(x, pattern [, match_option])
當(dāng)源字符串x匹配正則表達(dá)式pattern時(shí),返回true??梢允褂胢atch_option修改默認(rèn)匹配選項(xiàng),該參數(shù)可以被設(shè)置為:
- 'c', 說(shuō)明在進(jìn)行匹配時(shí)區(qū)分大小寫(默認(rèn)選項(xiàng))
- 'i', 說(shuō)明在進(jìn)行匹配時(shí)不區(qū)分大小寫
- 'n' 允許使用可以匹配任意字符的操作符(通常是'.')
- 'm', 將x作為一個(gè)包含多行的字符串
舉個(gè)例子:
SELECT * FROM test_reg WHERE REGEXP_LIKE(name, '(a)\1', 'i');
上面的SQL語(yǔ)句匹配test_reg表中name列含有兩個(gè)連續(xù)字符'a'(不區(qū)分大小寫)的行,如name='SaAs'。此外,這里我們還使用了正則表達(dá)式中的后引用語(yǔ)法——\n表示重復(fù)n次上次匹配的內(nèi)容,此處(a)\1表示匹配兩個(gè)連續(xù)的字符'a'。
需要注意的是,后引用必須使用雙括號(hào),否則會(huì)出現(xiàn)如下結(jié)果:
ORA-12727: 正則表達(dá)式中的后向引用無(wú)效
SQL> SELECT * FROM test_reg WHERE REGEXP_LIKE(name, '^_(a)\1', 'i');
NAME
---------- 實(shí)際應(yīng)該使用:
SQL> SELECT * FROM test_reg WHERE REGEXP_LIKE(name, '^.(a)\1', 'i');
NAME
---------- SaAs
最后一點(diǎn),不要混淆LIKE操作符的通配符和正則表達(dá)式的語(yǔ)法,也就是說(shuō)不要再正則表達(dá)式中使用LIKE操作符中的通配符,如果這樣做會(huì)得到未知的結(jié)果,因?yàn)?#39;_'和'%'會(huì)被正則表達(dá)式當(dāng)做普通字符進(jìn)行匹配。
比如下面這條SQL想要得到name='SaAs'這條記錄,但實(shí)際的查詢結(jié)果為空。

TA貢獻(xiàn)1830條經(jīng)驗(yàn) 獲得超3個(gè)贊
REGEXP_LIKE這個(gè)是正則表達(dá)式函數(shù),需要正則表達(dá)式來(lái)匹配結(jié)果。如,我要找一個(gè)表的列以 0 開始以 80 結(jié)束的長(zhǎng)度為6位的數(shù)據(jù),
SELECT * FROM staff a WHERE a.staff_code LIKE '0___80';
SELECT * FROM staff a WHERE REGEXP_LIKE(a.staff_code,'0[0-9]{3}80');
- 3 回答
- 0 關(guān)注
- 1460 瀏覽
添加回答
舉報(bào)