- 浏览: 7862836 次
- 性别:
- 来自: 广州
文章分类
- 全部博客 (2425)
- 软件工程 (75)
- JAVA相关 (662)
- ajax/web相关 (351)
- 数据库相关/oracle (218)
- PHP (147)
- UNIX/LINUX/FREEBSD/solaris (118)
- 音乐探讨 (1)
- 闲话 (11)
- 网络安全等 (21)
- .NET (153)
- ROR和GOG (10)
- [网站分类]4.其他技术区 (181)
- 算法等 (7)
- [随笔分类]SOA (8)
- 收藏区 (71)
- 金融证券 (4)
- [网站分类]5.企业信息化 (3)
- c&c++学习 (1)
- 读书区 (11)
- 其它 (10)
- 收藏夹 (1)
- 设计模式 (1)
- FLEX (14)
- Android (98)
- 软件工程心理学系列 (4)
- HTML5 (6)
- C/C++ (0)
- 数据结构 (0)
- 书评 (3)
- python (17)
- NOSQL (10)
- MYSQL (85)
- java之各类测试 (18)
- nodejs (1)
- JAVA (1)
- neo4j (3)
- VUE (4)
- docker相关 (1)
最新评论
-
xiaobadi:
jacky~~~~~~~~~
推荐两个不错的mybatis GUI生成工具 -
masuweng:
(转)JAVA获得机器码的实现 -
albert0707:
有些扩展名为null
java 7中可以判断文件的contenttype了 -
albert0707:
非常感谢!!!!!!!!!
java 7中可以判断文件的contenttype了 -
zhangle:
https://zhuban.me竹板共享 - 高效便捷的文档 ...
一个不错的网络白板工具
这个题目的确不大好写,其实际含义基于一个场景:
比如在oracle的某张表中,有两个字段
A1 B1
1 A,B,C,D,
2 E,F
假如现在的需求,是要统计A1中,每条记录拥有多少个数目的B1,比如
A1=1的时候,其B1的字段中有4个以逗号分隔的,所以数目为4,A1=2的,有
E,F共2个,所有数目为2
而在ORACLE中,如果使用ORACLE本身的函数,其实也是可以做到这个
效果的,核心是把这些逗号分隔的字符,逐一拆出来,变成一行行,上面的例子来说,
就要想办法变成
A1 B1
1 A
1 B
1 C
1 D
2 E
2 F
读者可能马上想到,这个其实是一对多关联关系的数据库存储方法,也是最常用的,
但有的时候,用A,B,C,D这样的方式也是可以保存一对多关系的,两种之间可以进行转换,
在oracle中有两种方法实现。
1) oracle中的正则表达式的函数REGEXP_SUBSTR
oracle中的REGEXP_SUBSTR的用法,先介绍下:
5个参数
第一个是输入的字符串
第二个是正则表达式
第三个是标识从第几个字符开始正则表达式匹配。(默认为1)
第四个是标识第几个匹配组。(默认为1)
第五个是是取值范围:
i:大小写不敏感;
c:大小写敏感;
n:点号 . 不匹配换行符号;
m:多行模式;
x:扩展模式,忽略正则表达式中的空白字符。
全部测试数据
SQL> select * from test_reg_substr;
A
-----------------------------------
ABC123XYZ
ABC123XYZ456
<Name>Edward</Name>
检索中间的数字
SQL> SELECT
2 REGEXP_SUBSTR(a,'[0-9]+')
3 FROM
4 test_reg_substr
5 WHERE
6 REGEXP_LIKE(a, '[0-9]+');
REGEXP_SUBSTR(A,'[0-9]+')
---------------------------------
123
123
检索中间的数字(从第一个字母开始匹配,找第2个匹配项目)
SQL> SELECT
2 NVL(REGEXP_SUBSTR(a,'[0-9]+',1, 2), '-') AS a
3 FROM
4 test_reg_substr
5 WHERE
6 REGEXP_LIKE(a, '[0-9]+');
A
------------------------------------------------------
-
456
取得“字符集合”
SQL> SELECT
2 REGEXP_SUBSTR(a, '\w+')
3 FROM
4 test_reg_substr
5 WHERE
6 REGEXP_LIKE(a, '\w+');
REGEXP_SUBSTR(A,'\W+')
-------------------------------
ABC123XYZ
ABC123XYZ456
Name
取得“字符集合”(从第一个字母开始匹配,找第2个匹配项目)
SQL> SELECT
2 NVL(REGEXP_SUBSTR(a, '\w+',1, 2), '-') AS a
3 FROM
4 test_reg_substr
5 WHERE
6 REGEXP_LIKE(a, '\w+');
A
---------------------------------------------------
-
-
Edward
更多的关于这个的介绍,可以看
http://topmanopensource.iteye.com/blog/1198638
这个文的小结,小结的不错。但要注意的是,在10G以上才支持,
方法1) 使用上面的正则,语句为
方法2)
select a1, substr(b1, 0, instr(b1, ',')) from
test union select a1, substr(b1, instr(b1, ',')+1,length(b1))
from test
方法3
使用SQL,首先在b1字段后面添加一个逗号,比如
要某条记录中B1的字段内容为'duan,shao,chu,tian'
SELECT L_COUNT,
SUBSTR('duan,shao,chu,tian' || ',',
INSTR('duan,shao,chu,tian' || ',',
',',
L_COUNT - 1,
DECODE(L_COUNT - 1, 0, 1, L_COUNT - 1)) + 1,
INSTR('duan,shao,chu,tian' || ',',
',',
1,
DECODE(L_COUNT - 1, 0, 1, L_COUNT - 1) + 1) -
INSTR('duan,shao,chu,tian' || ',',
',',
1,
DECODE(L_COUNT - 1, 0, 1, L_COUNT - 1)) - 1) AS RS
FROM DUAL,
(SELECT LEVEL L_COUNT
FROM DUAL
CONNECT BY LEVEL <
LENGTH('duan,shao,chu,tian' || ',') -
LENGTH(REPLACE('duan,shao,chu,tian' || ',', ',', '')) + 1);
其中2,3方法对oracle 9i也是可以使用的
比如在oracle的某张表中,有两个字段
A1 B1
1 A,B,C,D,
2 E,F
假如现在的需求,是要统计A1中,每条记录拥有多少个数目的B1,比如
A1=1的时候,其B1的字段中有4个以逗号分隔的,所以数目为4,A1=2的,有
E,F共2个,所有数目为2
而在ORACLE中,如果使用ORACLE本身的函数,其实也是可以做到这个
效果的,核心是把这些逗号分隔的字符,逐一拆出来,变成一行行,上面的例子来说,
就要想办法变成
A1 B1
1 A
1 B
1 C
1 D
2 E
2 F
读者可能马上想到,这个其实是一对多关联关系的数据库存储方法,也是最常用的,
但有的时候,用A,B,C,D这样的方式也是可以保存一对多关系的,两种之间可以进行转换,
在oracle中有两种方法实现。
1) oracle中的正则表达式的函数REGEXP_SUBSTR
oracle中的REGEXP_SUBSTR的用法,先介绍下:
5个参数
第一个是输入的字符串
第二个是正则表达式
第三个是标识从第几个字符开始正则表达式匹配。(默认为1)
第四个是标识第几个匹配组。(默认为1)
第五个是是取值范围:
i:大小写不敏感;
c:大小写敏感;
n:点号 . 不匹配换行符号;
m:多行模式;
x:扩展模式,忽略正则表达式中的空白字符。
全部测试数据
SQL> select * from test_reg_substr;
A
-----------------------------------
ABC123XYZ
ABC123XYZ456
<Name>Edward</Name>
检索中间的数字
SQL> SELECT
2 REGEXP_SUBSTR(a,'[0-9]+')
3 FROM
4 test_reg_substr
5 WHERE
6 REGEXP_LIKE(a, '[0-9]+');
REGEXP_SUBSTR(A,'[0-9]+')
---------------------------------
123
123
检索中间的数字(从第一个字母开始匹配,找第2个匹配项目)
SQL> SELECT
2 NVL(REGEXP_SUBSTR(a,'[0-9]+',1, 2), '-') AS a
3 FROM
4 test_reg_substr
5 WHERE
6 REGEXP_LIKE(a, '[0-9]+');
A
------------------------------------------------------
-
456
取得“字符集合”
SQL> SELECT
2 REGEXP_SUBSTR(a, '\w+')
3 FROM
4 test_reg_substr
5 WHERE
6 REGEXP_LIKE(a, '\w+');
REGEXP_SUBSTR(A,'\W+')
-------------------------------
ABC123XYZ
ABC123XYZ456
Name
取得“字符集合”(从第一个字母开始匹配,找第2个匹配项目)
SQL> SELECT
2 NVL(REGEXP_SUBSTR(a, '\w+',1, 2), '-') AS a
3 FROM
4 test_reg_substr
5 WHERE
6 REGEXP_LIKE(a, '\w+');
A
---------------------------------------------------
-
-
Edward
更多的关于这个的介绍,可以看
http://topmanopensource.iteye.com/blog/1198638
这个文的小结,小结的不错。但要注意的是,在10G以上才支持,
方法1) 使用上面的正则,语句为
SELECT distinct A1, REGEXP_SUBSTR(B1, '[^,]+', 1, LEVEL) AS A2 FROM TEST CONNECT BY LEVEL <= LENGTH(B1)-LENGTH(REPLACE(B1, ','))+1)
方法2)
select a1, substr(b1, 0, instr(b1, ',')) from
test union select a1, substr(b1, instr(b1, ',')+1,length(b1))
from test
方法3
使用SQL,首先在b1字段后面添加一个逗号,比如
要某条记录中B1的字段内容为'duan,shao,chu,tian'
SELECT L_COUNT,
SUBSTR('duan,shao,chu,tian' || ',',
INSTR('duan,shao,chu,tian' || ',',
',',
L_COUNT - 1,
DECODE(L_COUNT - 1, 0, 1, L_COUNT - 1)) + 1,
INSTR('duan,shao,chu,tian' || ',',
',',
1,
DECODE(L_COUNT - 1, 0, 1, L_COUNT - 1) + 1) -
INSTR('duan,shao,chu,tian' || ',',
',',
1,
DECODE(L_COUNT - 1, 0, 1, L_COUNT - 1)) - 1) AS RS
FROM DUAL,
(SELECT LEVEL L_COUNT
FROM DUAL
CONNECT BY LEVEL <
LENGTH('duan,shao,chu,tian' || ',') -
LENGTH(REPLACE('duan,shao,chu,tian' || ',', ',', '')) + 1);
其中2,3方法对oracle 9i也是可以使用的
发表评论
-
mybatis generator中的字段大小写生成问题
2017-10-22 19:35 11265mybatis generator插件中,如果 mysql数据 ... -
MySQL统计一个列中不同值的数量
2017-07-11 14:04 16240https://yiqiwuliao.com/post/mys ... -
mysql 1449 : The user specified as a definer ('root'@'%') does not exist 解决方法
2017-03-02 09:44 1745权限问题,授权 给 root 所有sql 权限 mysql ... -
几个不错的MYSQL 优化TIPS
2016-11-19 12:30 778图片来自http://imysql.com/的PDF分享 [ ... -
powerdesign 逆向ORACLE的坑
2016-09-27 17:08 532要注意的是,在WIN 64中,如果要用powerdesin 来 ... -
( 转)mysql中删除两条重复记录中的一条
2015-10-19 20:19 1303| id | createTime | labId | pub ... -
mysql中sql语句=,>的时候的索引设置
2015-05-02 12:27 1290在 https://www.percona.com/blog/ ... -
mysql中profile的使用
2015-04-30 11:11 2196mysql 的 sql 性能分析器主要用途是显示 sql 执行 ... -
mysql中的sql mode
2015-04-13 11:29 1121mysql sql mode小结 1 sql mode可以 ... -
PROCEDURE ANALYSE()为mysql提高性能提供建议
2015-04-02 16:37 1420procedure analyse();语法如下 select ... -
mongodb中意外退出的问题
2015-02-11 14:32 1319mongodb启动的时候,意外退出: Unclean shut ... -
mysql 5.5中保留字查询
2014-06-05 23:16 1458mysql 5.5中保留字查询 http://www.5is ... -
(转)oracle 临时表空间的增删改查
2014-03-18 12:44 1105oracle 临时表空间的增删改查 1、查看临时表空间 (d ... -
pl-sql developer安装
2014-02-07 09:16 1101一直都是机器本机上有oracle,所以装pl sql deve ... -
oracle中的nvl,nvl2等参数
2013-12-26 11:18 22501.nul函数将一个null值转换为一个实际的值。 数据类型可 ... -
Oracle中的ROWNUM rowid 以及MySQL中实现rownum功能类似的语句
2013-12-26 11:08 2333http://gong-10140.iteye.com/blo ... -
ORACLE XE版本的限制
2013-12-07 08:11 361610g中用户数据最大为4G, 11G中最大为11G,如果超出大 ... -
oracle中监控索引是否可用
2013-11-04 07:22 1045在oracle中,可以使用如下的方法监控索引是否可用: a ... -
mysql 5.6中的时间类型的新精度介绍
2013-10-28 09:33 8379留意到mysql 5.6中,可以使用select now(6) ... -
<<oracle索引技术》读书笔记1
2013-08-25 16:23 1299expert indexing in oracle datab ...
相关推荐
Oracle正则表达式函数全面解析
Oracle中的正则表达式 Oracle中的正则表达式 Oracle中的正则表达式
Oracle 10g正则表达式函数,包括正则表达式的规则等
position :起始位置,从第几个字符开始正则表达式匹配(默认为1) occurrence :标识第几个匹配组,默认为1 modifier :模式(‘i’不区分大小写进行检索;’c’区分大小写进行检索。默认为’c’) SELECT REGEXP_...
Oracle中使用正则表达式 正则详解正则详解正则详解正则详解正则详解正则详解
ORACLE 正则表达式的使用(REGEXP_LIKE REGEXP_INSTR REGEXP_SUBSTR REGEXP_REPLACE)
ORACLE.PLSQL正则表达式概述
Oracle正则表达式详解,用法+实例。
Oracle正则表达式与Oracle正则表达式函数
正则表达式应用广泛,在数据库中也有很大的应用空间,该篇文档讲述正则表达式在数据库中的应用。
oracle 数据库中 正则表达式 详细讲解 ,保证看了之后对正则表达式有一个深入的理解。对于不会用正则表达式的朋友非常有帮助。
详细介绍了Oracle10g中对正则表达式的支持与分析,Oracle的相关知识介绍,正则表达式的相关知识介绍
教你如何将正则表达式使用在SQL查询中,工作中经常需要,因为用正则表达式查询能更准确的查询出匹配的信息,学Oracle必须要懂得知识点
Oracle正则表达式函数介绍,Oracle中的支持正则表达式的函数主要有下面四个: 1.REGEXP_LIKE :与LIKE的功能相似 2.REGEXP_INSTR :与INSTR的功能相似 3.REGEXP_SUBSTR :与SUBSTR的功能相似 4.REGEXP_REPLACE :与...
Oracle数据库正则表达式及常用函数接收 ===
oracle正则表达式总结,包括语法与实例
Oracle正则表达式函数介绍[定义].pdf
Oracle正则表达式参考手册 ,《Oracle Regular Expressions Pocket Reference 》 Oracle Regular Expressions Pocket Reference is part tutorial and part quick-reference.
Oracle 10g正则表达式详解,REGEXP_LIKE,REGEXP_INSTR,REGEXP_SUBSTR,REGEXP_REPLACE