[英]Oracle Regular Expression using instead of INSTR function
我像這樣將數據保留在表行上;
課程
+------+------------------------------------------+
| sid | courses |
+------+------------------------------------------+
| 1 | cs101.math102.ns202-2.phy104 |
+------+------------------------------------------+
| 2 | cs101.math201.ens202-1.phy104-10.chm105 |
+------+------------------------------------------+
| 3 | cs101.ns202-2.math201.ens202-1.phy104 |
+------+------------------------------------------+
現在,我想同時參加ns202和ens202課程的總和。 通常,它只應帶來id為3的記錄,它帶來所有記錄(由於instr)。 我已經為此使用了許多方法,但是它不起作用。 例如;
select count(*) from
t_course
where
instr(courses, 'ns202') > 0
and instr(courses, 'ens202') > 0;
上面的代碼無法正常工作,因為它需要ns202,但是ens202本身包含ns202。
我嘗試使用正則表達式,將所有過程都轉換為行(拆分),但這既破壞了工作邏輯,又減慢了速度。
我該如何使用正則表達式而不是按照開頭(例如ns202%)邏輯的instr做到這一點? (從ns202開始或在點之后)
您可以將regexp_like
與單詞邊界一起使用,以獲取同時具有ns202
和ens_202
。 通常,您會使用\\b
來表示單詞邊界。 由於Oracle不支持,備用方法是將(\\s|\\W)
與開始^
和結束$
錨點一起使用。
\\s
空格字符, \\W
非單詞字符。 根據需要添加更多字符,作為單詞邊界。
select *
from t_course
where regexp_like(courses,'(^|\s|\W)ns202(\s|\W|$)')
and regexp_like(courses,'(^|\s|\W)ens202(\s|\W|$)')
您將對ens202
同樣的問題-如果同時也有cens202
或tens202
怎么tens202
?
您可以使用正則表達式解決問題。 您還可以使用LIKE運算符解決它:
select <whatever>
from <table or tables>
where (courses like 'ns202%' or courses like '%.ns202%')
and (courses like 'ens202%' or courses like '%.ens202%')
您可以測試這兩種方法,以查看哪種方法最適合您的數據。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.