簡體   English   中英

Oracle正則表達式使用代替INSTR函數

[英]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與單詞邊界一起使用,以獲取同時具有ns202ens_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同樣的問題-如果同時也有cens202tens202怎么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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM