[英]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.