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

判断一个字符型字段中出现某个字符超过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

原文发布于微信公众号 - 杨建荣的学习笔记(jianrong-notes)

原文发表时间:2014-04-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏乐沙弥的世界

Oracle 全球化特性与字符集

数据库的全球化特性是数据库发展的必然结果,位于不同地区、不同国家、不用语言而使用同一数据库越来越普遍。Oracle数据库提供

341
来自专栏乐沙弥的世界

PL/SQL变长数组

  PL/SQL变长数组时PL/SQL集合数据类型中的一种,其使用方法与PL/SQL嵌套表大同小异,唯一的区别则是变长数组的元素的最大个数是有限 制的。也即是说...

592
来自专栏Java技术

面试中有哪些经典的数据库问题?

1、如果我们定义了主键(PRIMARY KEY),那么InnoDB会选择主键作为聚集索引、如果没有显式定义主键,则InnoDB会选择第一个不包含有NULL值的唯...

721
来自专栏文渊之博

SQL Server 2016 JSON原生支持实例说明

背景 Microsoft SQL Server 对于数据平台的开发者来说越来越友好。比如已经原生支持XML很多年了,在这个趋势下,如今也能在SQLServer2...

18610
来自专栏DT乱“码”

Oracle存储过程基本语法介绍

Oracle存储过程基本语法 存储过程    1 CREATE OR REPLACE PROCEDURE 存储过程名    2 IS    3 BEGIN...

1945
来自专栏吾爱乐享

软件测试之学习mysql的增删改(数据库重点)

1012
来自专栏工科狗和生物喵

【计算机本科补全计划】Mysql 学习小计(2)

正文之前 昨天下午写了篇 Mysql学习小计,结果出乎意料的受欢迎?变相刺激了我多写点 Mysql?好吧,如尔所愿。我晚上反正还不知道学点啥,就把今天看的那个菜...

34611
来自专栏MYSQL轻松学

面试中有哪些经典的数据库问题?

1、如果我们定义了主键(PRIMARY KEY),那么InnoDB会选择主键作为聚集索引、如果没有显式定义主键,则InnoDB会选择第一个不包含有NULL值的唯...

1130
来自专栏Jackson0714

基础很重要~~04.表表达式-上篇

31512
来自专栏逸鹏说道

SQL Server 深入解析索引存储(中)

概述 本篇文章是关于堆的存储结构。堆是不含聚集索引的表(所以只有非聚集索引的表也是堆)。堆的 sys.partitions 中具有一行,对于堆使用的每...

3288

扫码关注云+社区