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 相关文章推荐
oracle DGMGRL ORA-16603报错的解决方法(DG Broker)
Apr 06 Oracle
ORACLE数据库对long类型字段进行模糊匹配的解决思路
Apr 07 Oracle
oracle通过存储过程上传list保存功能
May 12 Oracle
Oracle11g r2 卸载干净重装的详细教程(亲测有效已重装过)
Jun 04 Oracle
SQL模糊查询报:ORA-00909:参数个数无效问题的解决
Jun 21 Oracle
Oracle 临时表空间SQL语句的实现
Sep 25 Oracle
Oracle安装TNS_ADMIN环境变量设置参考
Nov 01 Oracle
使用Oracle命令进行数据库备份与还原
Dec 06 Oracle
分析SQL窗口函数之取值窗口函数
Apr 21 Oracle
Oracle 11g数据库使用expdp每周进行数据备份并上传到备份服务器
Jun 28 Oracle
oracle delete误删除表数据后如何恢复
Jun 28 Oracle
快速学习Oracle触发器和游标
使用Oracle跟踪文件的问题详解
SQL模糊查询报:ORA-00909:参数个数无效问题的解决
ORACLE查看当前账号的相关信息
DBCA命令行搭建Oracle ADG的流程
ORACLE数据库应用开发的三十个注意事项
Jun 07 #Oracle
Oracle创建只读账号的详细步骤
You might like
5种PHP创建数组的实例代码分享
2014/01/17 PHP
php截取字符串函数分享
2015/02/02 PHP
PHP学习笔记(二):变量详解
2015/04/17 PHP
yii框架结合charjs统计上一年与当前年数据的方法示例
2020/04/04 PHP
php数值计算num类简单操作示例
2020/05/15 PHP
小型js框架veryide.librar源代码
2009/03/05 Javascript
兼容ie、firefox的图片自动缩放的css跟js代码分享
2012/01/21 Javascript
JS实现金额转换(将输入的阿拉伯数字)转换成中文的实现代码
2013/09/30 Javascript
返回上一页并自动刷新的JavaScript代码
2014/02/19 Javascript
jquery判断输入密码两次是否相等
2020/04/22 Javascript
Winform客户端向web地址传参接收参数的方法
2016/05/17 Javascript
如何检测JavaScript的各种类型
2016/07/30 Javascript
Vue.js实现简单ToDoList 前期准备(一)
2016/12/01 Javascript
详解JavaScript中数组的reduce方法
2016/12/02 Javascript
js 数字、字符串、布尔值的转换方法(必看)
2017/04/07 Javascript
解决AjaxFileupload 上传时会出现连接重置的问题
2017/07/07 Javascript
微信小程序 websocket 实现SpringMVC+Spring+Mybatis
2017/08/04 Javascript
微信小程序实现动态改变view标签宽度和高度的方法【附demo源码下载】
2017/12/05 Javascript
vue中v-for加载本地静态图片方法
2018/03/03 Javascript
vue 过滤器filter实例详解
2018/03/14 Javascript
vue脚手架搭建过程图解
2018/06/06 Javascript
angular 未登录状态拦截路由跳转的方法
2018/10/09 Javascript
微信小程序日历弹窗选择器代码实例
2019/05/09 Javascript
python分割和拼接字符串
2013/11/01 Python
Python编程之event对象的用法实例分析
2017/03/23 Python
Python+opencv 实现图片文字的分割的方法示例
2019/07/04 Python
Python使用百度api做人脸对比的方法
2019/08/28 Python
Flask中sqlalchemy模块的实例用法
2020/08/02 Python
让ie浏览器成为支持html5的浏览器的解决方法(使用html5shiv)
2014/04/08 HTML / CSS
美国畅销的跑步机品牌:ProForm
2017/02/06 全球购物
存储过程和函数的区别
2013/05/28 面试题
写好自荐信需做到的5要点
2014/03/07 职场文书
管辖权异议上诉状
2015/05/23 职场文书
年会主持人开场白台词
2015/05/29 职场文书
2019旅游导游工作总结
2019/06/27 职场文书
分享提高 Python 代码的可读性的技巧
2022/03/03 Python