- 浏览: 7944372 次
- 性别:
- 来自: 广州
文章分类
- 全部博客 (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 11405mybatis generator插件中,如果 mysql数据 ... -
MySQL统计一个列中不同值的数量
2017-07-11 14:04 16293https://yiqiwuliao.com/post/mys ... -
mysql 1449 : The user specified as a definer ('root'@'%') does not exist 解决方法
2017-03-02 09:44 1801权限问题,授权 给 root 所有sql 权限 mysql ... -
几个不错的MYSQL 优化TIPS
2016-11-19 12:30 818图片来自http://imysql.com/的PDF分享 [ ... -
powerdesign 逆向ORACLE的坑
2016-09-27 17:08 573要注意的是,在WIN 64中,如果要用powerdesin 来 ... -
( 转)mysql中删除两条重复记录中的一条
2015-10-19 20:19 1335| id | createTime | labId | pub ... -
mysql中sql语句=,>的时候的索引设置
2015-05-02 12:27 1312在 https://www.percona.com/blog/ ... -
mysql中profile的使用
2015-04-30 11:11 2236mysql 的 sql 性能分析器主要用途是显示 sql 执行 ... -
mysql中的sql mode
2015-04-13 11:29 1160mysql sql mode小结 1 sql mode可以 ... -
PROCEDURE ANALYSE()为mysql提高性能提供建议
2015-04-02 16:37 1476procedure analyse();语法如下 select ... -
mongodb中意外退出的问题
2015-02-11 14:32 1344mongodb启动的时候,意外退出: Unclean shut ... -
mysql 5.5中保留字查询
2014-06-05 23:16 1492mysql 5.5中保留字查询 http://www.5is ... -
(转)oracle 临时表空间的增删改查
2014-03-18 12:44 1151oracle 临时表空间的增删改查 1、查看临时表空间 (d ... -
pl-sql developer安装
2014-02-07 09:16 1137一直都是机器本机上有oracle,所以装pl sql deve ... -
oracle中的nvl,nvl2等参数
2013-12-26 11:18 22871.nul函数将一个null值转换为一个实际的值。 数据类型可 ... -
Oracle中的ROWNUM rowid 以及MySQL中实现rownum功能类似的语句
2013-12-26 11:08 2368http://gong-10140.iteye.com/blo ... -
ORACLE XE版本的限制
2013-12-07 08:11 367710g中用户数据最大为4G, 11G中最大为11G,如果超出大 ... -
oracle中监控索引是否可用
2013-11-04 07:22 1086在oracle中,可以使用如下的方法监控索引是否可用: a ... -
mysql 5.6中的时间类型的新精度介绍
2013-10-28 09:33 8421留意到mysql 5.6中,可以使用select now(6) ... -
<<oracle索引技术》读书笔记1
2013-08-25 16:23 1331expert indexing in oracle datab ...
相关推荐
在Oracle数据库中,有时我们遇到一个特殊的查询需求,即字段中的值是以逗号分隔的字符串,我们需要根据每个单独的值来查询数据。在这种情况下,简单的`LIKE`查询无法满足需求,因为`LIKE`通常用于匹配模式,而不是...
在Oracle数据库中,将逗号分隔的字符串转换为多行是常见的数据处理需求,尤其在需要对每个分隔项进行单独操作时。这个过程通常涉及到字符串处理函数,如`REGEXP_SUBSTR`和`REPLACE`,以及层次查询结构`CONNECT BY`。...
总结来说,处理逗号分隔的字符串时,Oracle提供了强大的正则表达式功能。`REGEXP_SUBSTR`和`REGEXP_REPLACE`这两个函数可以帮助我们有效地分析和操作这些字符串。通过结合使用`INTERSECT`和`MINUS`操作符,我们可以...
6. **正则表达式函数**: - `REGEXP_LIKE`用于在WHERE子句中进行正则表达式匹配。 - `REGEXP_SUBSTR`从源字符串中提取符合正则表达式的子串。 - `REGEXP_INSTR`找到正则表达式在源字符串中出现的位置。 - `...
这篇博客“一个oracle根据特定字符截取数据”分享了一个实用的方法,适用于那些需要从字符串字段中提取部分信息的情况。通过SQL查询,我们可以高效地完成这项任务。 在Oracle SQL中,有多个内置函数可以帮助我们...
这里利用了Oracle的正则表达式功能,通过`regexp_substr`函数与`CONNECT BY`结合,实现了将字符串按照指定分隔符(这里是逗号)进行分割,并以表的形式展示分割后的每一项。 5. 结论: 通过本文的介绍,我们可以...
数据清洗可能通过正则表达式、pandas内置函数或者自定义逻辑来实现。例如,它可能会检查并处理重复行、转换数据类型,以及确保数值字段没有非数字字符等。 在转换过程中,特定分隔符转换是一个关键环节。不同的系统...
- 根据表中的行创建一个分隔列表:将行数据合并为一个逗号分隔的字符串。 - 提取第n个分隔的子串:使用数据库的字符串分割函数。 - 分解IP地址:将IP地址字符串拆分成单独的数字。 - 将分隔数据转换为多值IN列表...
2. **解析文本数据**:根据分隔符,使用`SplitString`函数或者正则表达式对每行文本进行拆分,将字段分离出来。 3. **连接数据库**:使用ADO(ActiveX Data Objects)或BDE(Borland Database Engine)组件,可以...
4. **正则表达式搜索**: 通过`apropos("topic")`来查找所有符合正则表达式"topic"的对象名称。 5. **HTML帮助**: `help.start()`可以打开HTML形式的帮助文档,这对于需要更详细信息的用户非常有用。 6. **对象结构**...
1. **数据库内置函数处理**: 如果参数值是从数据库中获取的, 大多数数据库都提供了处理 null 值的函数, 如 MySQL 的 ISNULL 函数。 2. **JavaScript 步骤处理**: 如果参数值是从其他步骤中获得的, 可以通过 ...