关于字符串匹配查找的总结(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 条评论
登录 后参与评论

相关文章

来自专栏程序猿DD

死磕Java并发:深入分析synchronized的实现原理

记得刚刚开始学习Java的时候,一遇到多线程情况就是synchronized。对于当时的我们来说,synchronized是如此的神奇且强大。我们赋予它一个名字...

1086
来自专栏Java架构

深入浅出JVM的锁优化案例锁优化

线程阻塞的时候,让等待的线程不放弃cpu执行时间,而是执行一个自旋(一般是空循环),这叫做自旋锁。

993
来自专栏Spark学习技巧

细谈CAS与ABA

题目:如何实现乐观锁(CAS),如何避免ABA问题? 本文阅读大概需要15分钟。 这个题主要考查原子操作、悲观锁、乐观锁及ABA问题。 一 原子操作 原子在化...

3045
来自专栏Java架构沉思录

关于Java锁机制面试官会怎么问

悲观锁:总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁。传统的关系型数据库里边...

751
来自专栏java一日一条

Java并发问题--乐观锁与悲观锁以及乐观锁的一种实现方式-CAS

悲观锁:总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁。传统的关系型数据库里边...

342
来自专栏Core Net

ASP.NET Core 2.0 : 八.图说管道,唐僧扫塔的故事

1654
来自专栏一个会写诗的程序员的博客

《Kotin 极简教程》第9章 轻量级线程:协程(2)《Kotlin极简教程》正式上架:

如果需要依次调用它们, 我们只需要使用正常的顺序调用, 因为协同中的代码 (就像在常规代码中一样) 是默认的顺序执行。下面的示例通过测量执行两个挂起函数所需的总...

732
来自专栏芋道源码1024

【死磕Java并发】—–深入分析synchronized的实现原理

记得刚刚开始学习Java的时候,一遇到多线程情况就是synchronized,相对于当时的我们来说synchronized是这么的神奇而又强大,那个时候我们赋予...

3138
来自专栏Java技术

Java多线程编程-(16)-无锁CAS操作以及Java中Atomic并发包的“18罗汉”

通过上面的学习,我们应该很清楚的知道了在多线程并发情况下如何保证数据的安全性和一致性的两种主要方法:一种是加锁,另一种是使用ThreadLocal。锁是一种以时...

663
来自专栏JAVA技术zhai

干货:Java并发编程系列之synchronized(一)

2567

扫描关注云+社区