关于字符串匹配查找的总结(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
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 排障集锦:九九八十一难之第九难!mysql备份恢复路上的小插曲
- jQuery限制复选框checkbox的选中次数
- jQuery点击切换增加和删除class类
- Vue使用props和emit父子组件通信
- 听说Mysql你很豪横?-------------呕心沥血深入解析mysql备份与恢复!!!
- 排障集锦:九九八十一难之第十难!mysq备份恢复,Could not read entry at offset *: Error in log format or read error.
- Vue使用ref父子组件通信
- 听说Mysql你很豪横?-------------MySQL5.7主从同步
- 听说Mysql你很豪横?-------------MySQL5.7主从复制!读写分离!
- Vue兄弟组件传值
- Vue设置浏览器的标题title和图标icon
- VantUI封装自定义Tabbar路由跳转
- 听说Mysql你很豪横?-------------分分钟带你玩转SQL高级查询语句(常用查询,正则表达式,运算符)
- jQuery实现点击添加样式同胞移除样式
- 微信小程序生命周期