前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >关于字符串匹配查找的总结(43天)

关于字符串匹配查找的总结(43天)

作者头像
jeanron100
发布2018-03-13 18:15:15
8220
发布2018-03-13 18:15:15
举报

判断一个字符型字段中出现某个字符超过3次的数据行,如果为了简单达到目的,可以直接使用Like来做, SQL> select content from clob_test where content like '%is%is%is%'; CONTENT -------------------------------------------------------------------------------- this is a test,and it is very useful 但是可能在实际应用中,如果有一些有些特别的需求,比如判断某个字符串出现的次数20次以上的。用Like就有些体力活了。 如果字段类型是clob,可以使用dbms_lob.instr来实现。 FUNCTION INSTR RETURNS NUMBER(38) Argument Name Type In/Out Default? ------------------------------ ----------------------- ------ -------- FILE_LOC BINARY FILE LOB IN PATTERN RAW IN OFFSET NUMBER(38) IN DEFAULT NTH NUMBER(38) IN DEFAULT 下面来做一个简单的测试。 SQL> create table clob_test(content clob); Table created. SQL> insert into clob_test values('this is a test,and it is very useful'); 1 row created. SQL> insert into clob_test values('here it is'); 1 row created. SQL> commit; Commit complete. 从中查找出现is超过3次的数据行。 SQL> select content from clob_test where dbms_lob.instr(content,'is',1,3)>0; CONTENT -------------------------------------------------------------------------------- this is a test,and it is very useful 如果是varchar2类型,貌似只能使用like了。其实不然。 如果在10g版本内,对于字符串想自己写一个类似的函数来处理,可以类似下面的形式。 SQL> select content from clob_test where (length(content)-length(replace(content,'is',null)))/(length('is'))>=3; CONTENT -------------------------------------------------------------------------------- this is a test,and it is very useful 如果在这个基础上想更进一步,可以使用11g的regexp_count来实现。 SQL> select content from clob_test where regexp_count(content,'is')>=3; CONTENT -------------------------------------------------------------------------------- this is a test,and it is very useful 从上面的例子,可以看出这个函数有多实用,省去了很多其他的处理。 当然了在11g版本中,还有regexp_substr,regexp_instr,regexp_like等等的函数,也很实用。 加一个字段,在varchar2上作这个测试。 SQL> alter table clob_test add(content2 varchar2(1000)); Table altered. SQL> insert into clob_test(content2) values('stringtest=100#stringtest=50'); 1 row created. SQL> insert into clob_test(content2) values('stringtest=200#stringtest=60'); 1 row created. 现在是想截取 串"stringtest=100#stringtest=50"中间的100 如果按照一般的思路,可以这样来做。 select TO_NUMBER ( SUBSTR ( content2, INSTR (content2, 'stringtest=') + 11, INSTR ( SUBSTR ( content2, INSTR (content2, 'stringtest=') + 11), '#') - 1))content3 from clob_test where content2 is not null; CONTENT3 ---------- 100 200 如果使用regexp_substr来的话,可能一行就可以了。 SQL> select 2 to_number(replace(regexp_substr(content2,'[^stringtest=]+',1,1) ,'#','')) context3 from clob_test where content2 is not null; CONTEXT3 ---------- 100 200

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2014-04-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 杨建荣的学习笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档