繁体   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