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设置DB、监听和EM开机启动的方法
Apr 25 Oracle
oracle覆盖导入dmp文件的2种方法
May 21 Oracle
Oracle11g r2 卸载干净重装的详细教程(亲测有效已重装过)
Jun 04 Oracle
Oracle 触发器trigger使用案例
Feb 24 Oracle
详细聊聊Oracle表碎片对性能有多大的影响
Mar 19 Oracle
详解SQL的窗口函数
Apr 21 Oracle
分析SQL窗口函数之取值窗口函数
Apr 21 Oracle
SQL试题 使用窗口函数选出连续3天登录的用户
Apr 24 Oracle
Oracle锁表解决方法的详细记录
Jun 05 Oracle
快速学习Oracle触发器和游标
使用Oracle跟踪文件的问题详解
SQL模糊查询报:ORA-00909:参数个数无效问题的解决
ORACLE查看当前账号的相关信息
DBCA命令行搭建Oracle ADG的流程
ORACLE数据库应用开发的三十个注意事项
Jun 07 #Oracle
Oracle创建只读账号的详细步骤
You might like
几种显示数据的方法的比较
2006/10/09 PHP
Codeigniter中禁止A Database Error Occurred错误提示的方法
2014/06/12 PHP
ucenter通信原理分析
2015/01/09 PHP
Windows平台实现PHP连接SQL Server2008的方法
2017/07/26 PHP
PHP大文件分片上传的实现方法
2018/10/28 PHP
php文件操作之文件写入字符串、数组的方法分析
2019/04/15 PHP
ThinkPHP类似AOP思想的参数验证的实现方法
2019/12/18 PHP
php+ajax实现文件切割上传功能示例
2020/03/03 PHP
使用jquery操作session方法分享
2015/01/22 Javascript
JavaScript学习笔记之Cookie对象
2015/01/22 Javascript
js焦点文字滚动效果代码分享
2015/08/25 Javascript
JS实现部分HTML固定页面顶部随屏滚动效果
2015/12/24 Javascript
AngularJS过滤器filter用法实例分析
2016/11/04 Javascript
node+experss实现爬取电影天堂爬虫
2016/11/20 Javascript
JQueryEasyUI框架下的combobox的取值和绑定的方法
2017/01/22 Javascript
AngularJS表单验证功能分析
2017/05/26 Javascript
关于vuejs中v-if和v-show的区别及v-show不起作用问题
2018/03/26 Javascript
脚手架vue-cli工程webpack的基本用法详解
2018/09/29 Javascript
2020淘宝618理想生活列车自动领喵币js脚本的代码
2020/06/02 Javascript
electron踩坑之remote of undefined的解决
2020/10/06 Javascript
跟老齐学Python之不要红头文件(1)
2014/09/28 Python
Python HTTP客户端自定义Cookie实现实例
2017/04/28 Python
Python实现接受任意个数参数的函数方法
2018/04/21 Python
python调用百度语音识别api
2018/08/30 Python
深入解析python中的实例方法、类方法和静态方法
2019/03/11 Python
聊聊python里如何用Borg pattern实现的单例模式
2019/06/06 Python
pyqt5 实现多窗口跳转的方法
2019/06/19 Python
python matplotlib 画dataframe的时间序列图实例
2019/11/20 Python
使用jupyter notebook将文件保存为Markdown,HTML等文件格式
2020/04/14 Python
Python绘制全球疫情变化地图的实例代码
2020/04/20 Python
python 逆向爬虫正确调用 JAR 加密逻辑
2021/01/12 Python
一家外企的面试题目(C/C++面试题,C语言面试题)
2014/03/24 面试题
母亲追悼会答谢词
2014/01/27 职场文书
自查自纠工作情况报告
2014/10/29 职场文书
分析ZooKeeper分布式锁的实现
2021/06/30 Java/Android
从零开始在Centos7上部署SpringBoot项目
2022/04/07 Servers