Oracle以逗号分隔的字符串拆分为多行数据实例详解


Posted in Oracle onJuly 16, 2021

前言

近期在工作中遇到某表某字段是可扩展数据内容,信息以逗号分隔生成的,现需求要根据此字段数据在其它表查询相关的内容展现出来,第一想法是切割数据,以逗号作为切割符,以下为总结的实现方法,以供大家参考、指教。

Oracle以逗号分隔的字符串拆分为多行数据实例详解

1、regexp_substr函数,通过正则来拆分字符串,函数用法为:(必须是oracle 10g+的版本才支持)

 REGEXP_SUBSTR函数格式如下:

function REGEXP_SUBSTR(String, pattern, position, occurrence, modifier)

__srcstr :需要进行正则处理的字符串

__pattern :进行匹配的正则表达式

__position :起始位置,从第几个字符开始正则表达式匹配(默认为1)

__occurrence :获取第几个分割出来的组(分割后最初的字符串会按分割的顺序排列成组),默认为1

__modifier :模式('i'不区分大小写进行检索;'c'区分大小写进行检索。默认为'c'。)针对的是正则表达式里字符大小写的匹配

-------------------------------------------------------------------------------------------------------------------

Oracle以逗号分隔的字符串拆分为多行数据实例详解

  此函数只能每次取一个字符串出来,有点鸡肋,字符串中逗号的数量是不确定的,如果有2个逗号,需要提取的字段就是3个。为了确定有多少个需要提取的字段,需要用到connect by命令实现动态参数构造连续的值,通过原字符串长度和被替换后字符串长度相减,可以得到原字符串中的逗号数量,加1后得到需要提取的匹配字段数量。

Oracle以逗号分隔的字符串拆分为多行数据实例详解

 SQL:

select bs from cs1_0 where slid='201804100038'
--正则分割后的第一个值
SELECT REGEXP_SUBSTR((select bs from cs1_0 where slid='201804100038'),'[^,]+',1,1,'i') as 分割后结果 FROM DUAL;
--获取一个多个数值的列,从而能够让结果以多行的形式展示出来 
SELECT LEVEL FROM DUAL CONNECT BY LEVEL <=5;
--将上面REGEXP_SUBSTR的occurrence(标识第几个匹配组)实现动态参数,使用 connect by组合起来
SELECT REGEXP_SUBSTR((select bs from cs1_0 where slid='201804100038'),'[^,]+',1,LEVEL,'i') as 分割后结果 FROM DUAL CONNECT BY LEVEL <=5;
--优化一下(动态获匹配组标识行数)
select regexp_substr((select bs from cs1_0 where slid='201804100038'),'[^,]+',1,LEVEL,'i') as 分割后结果 from dual 
connect by level <= length((select bs from cs1_0 where slid='201804100038'))-length(regexp_replace((select bs from cs1_0 where slid='201804100038'),',',''))+1;

2、以Type类型和function函数的方式实现

1)建立TYPE类型


CREATE OR REPLACE TYPE strsplit_type_12 IS TABLE OF VARCHAR2 (4000)

2)建立function存储函数
create or replace function strsplit_66(p_value varchar2,p_split varchar2 )  --字符串,切割符
--根据特定字符来切割字符串
 return strsplit_type_12
  pipelined is
  v_idx       integer;
  v_str       varchar2(500);
  v_strs_last varchar2(4000) := p_value;

begin
  loop
    v_idx := instr(v_strs_last, p_split);
    exit when v_idx = 0;
    v_str       := substr(v_strs_last, 1, v_idx - 1);
    v_strs_last := substr(v_strs_last, v_idx + 1);
    pipe row(v_str);
  end loop;
  pipe row(v_strs_last);
  return;
end strsplit_66;

SELECT ROWNUM 序号, a.* FROM TABLE(strsplit_66((select bs from cs1_0 where slid='201804100038'), ',')) a;

 测试一下:

Oracle以逗号分隔的字符串拆分为多行数据实例详解

总结

到此这篇关于Oracle以逗号分隔的字符串拆分为多行数据的文章就介绍到这了,更多相关Oracle拆分多行数据内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Oracle 相关文章推荐
zabbix agent2 监控oracle数据库的方法
May 13 Oracle
oracle连接ODBC sqlserver数据源的详细步骤
Jul 25 Oracle
Oracle 临时表空间SQL语句的实现
Sep 25 Oracle
使用Oracle命令进行数据库备份与还原
Dec 06 Oracle
Oracle 多表查询基本语法实例
Apr 18 Oracle
Oracle使用别名的好处
Apr 19 Oracle
分析SQL窗口函数之聚合窗口函数
Apr 21 Oracle
分析SQL窗口函数之取值窗口函数
Apr 21 Oracle
oracle数据库去除重复数据
May 20 Oracle
Oracle锁表解决方法的详细记录
Jun 05 Oracle
在Oracle表中进行关键词搜索的过程
Jun 10 Oracle
ORACLE中dbms_output.put_line输出问题的解决过程
Jun 28 Oracle
快速学习Oracle触发器和游标
使用Oracle跟踪文件的问题详解
SQL模糊查询报:ORA-00909:参数个数无效问题的解决
ORACLE查看当前账号的相关信息
DBCA命令行搭建Oracle ADG的流程
ORACLE数据库应用开发的三十个注意事项
Jun 07 #Oracle
Oracle创建只读账号的详细步骤
You might like
DC漫画《蝙蝠侠和猫女》图透 猫女怀孕老爷当爹
2020/04/09 欧美动漫
php入门学习知识点二 PHP简单的分页过程与原理
2011/07/14 PHP
PHP中获取时间的下一周下个月的方法
2014/03/18 PHP
ThinkPHP3.1新特性之对页面压缩输出的支持
2014/06/19 PHP
php版微信自动获取收货地址api用法示例
2016/09/22 PHP
Laravel实现ApiToken认证请求
2019/10/14 PHP
js弹出层包含flash 不能关闭隐藏的2种处理方法
2013/06/17 Javascript
Jquery焦点图实例代码
2014/11/25 Javascript
详解JavaScript中循环控制语句的用法
2015/06/03 Javascript
JavaScript学习笔记之数组随机排序
2016/03/23 Javascript
node.js与C语言 实现遍历文件夹下最大的文件,并输出路径,大小
2017/01/20 Javascript
Es6 Generator函数详细解析
2018/02/24 Javascript
vue+axios+mock.js环境搭建的方法步骤
2018/08/28 Javascript
nodejs初始化init的示例代码
2018/10/10 NodeJs
Node.js EventEmmitter事件监听器用法实例分析
2019/01/07 Javascript
Element-Ui组件 NavMenu 导航菜单的具体使用
2019/10/24 Javascript
关于vue2强制刷新,解决页面不会重新渲染的问题
2019/10/29 Javascript
element中el-container容器与div布局区分详解
2020/05/13 Javascript
[06:50]DSPL次级职业联赛十强晋级之路
2014/11/18 DOTA
详解python校验SQL脚本命名规则
2019/03/22 Python
Python 使用 attrs 和 cattrs 实现面向对象编程的实践
2019/06/12 Python
使用Django xadmin 实现修改时间选择器为不可输入状态
2020/03/30 Python
美国宠物商店:Wag.com
2016/10/25 全球购物
GEOX鞋美国官方网站:意大利会呼吸的鞋
2017/07/12 全球购物
新西兰演唱会和体育门票网站:Ticketmaster新西兰
2017/10/07 全球购物
俄罗斯名牌服装网上商店:UNIQUE FABRIC
2019/07/25 全球购物
网络编程中设计并发服务器,使用多进程与多线程,请问有什么区别?
2016/03/27 面试题
移动通信行业实习自我鉴定
2013/09/28 职场文书
汽车销售求职自荐信
2013/10/01 职场文书
应届毕业生个人求职自荐信
2014/01/06 职场文书
综治宣传月活动总结
2014/04/28 职场文书
英文版辞职信
2015/02/28 职场文书
钓鱼岛事件感想
2015/08/11 职场文书
Python基础之赋值,浅拷贝,深拷贝的区别
2021/04/30 Python
再次探讨go实现无限 buffer 的 channel方法
2021/06/13 Golang
CSS 实现磨砂玻璃(毛玻璃)效果样式
2023/05/21 HTML / CSS