• 售前

  • 售后

热门帖子
入门百科

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

[复制链接]
快乐人L 显示全部楼层 发表于 2021-8-14 14:53:26 |阅读模式 打印 上一主题 下一主题
前言

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

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

REGEXP_SUBSTR函数格式如下:
  1. function REGEXP_SUBSTR(String, pattern, position, occurrence, modifier)
复制代码
__srcstr :需要举行正则处理处罚的字符串
__pattern :举行匹配的正则表达式
__position :起始位置,从第几个字符开始正则表达式匹配(默认为1)
__occurrence :获取第几个分割出来的组(分割后最初的字符串会按分割的次序分列成组),默认为1
__modifier :模式('i'不区分大小写举行检索;'c'区分大小写举行检索。默认为'c'。)针对的是正则表达式里字符大小写的匹配
-------------------------------------------------------------------------------------------------------------------

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

SQL:
  1. select bs from cs1_0 where slid='201804100038'
  2. --正则分割后的第一个值
  3. SELECT REGEXP_SUBSTR((select bs from cs1_0 where slid='201804100038'),'[^,]+',1,1,'i') as 分割后结果 FROM DUAL;
  4. --获取一个多个数值的列,从而能够让结果以多行的形式展示出来
  5. SELECT LEVEL FROM DUAL CONNECT BY LEVEL <=5;
  6. --将上面REGEXP_SUBSTR的occurrence(标识第几个匹配组)实现动态参数,使用 connect by组合起来
  7. SELECT REGEXP_SUBSTR((select bs from cs1_0 where slid='201804100038'),'[^,]+',1,LEVEL,'i') as 分割后结果 FROM DUAL CONNECT BY LEVEL <=5;
  8. --优化一下(动态获匹配组标识行数)
  9. select regexp_substr((select bs from cs1_0 where slid='201804100038'),'[^,]+',1,LEVEL,'i') as 分割后结果 from dual
  10. 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. 1)建立TYPE类型
  2. CREATE OR REPLACE TYPE strsplit_type_12 IS TABLE OF VARCHAR2 (4000)
  3. 2)建立function存储函数
  4. create or replace function strsplit_66(p_value varchar2,p_split varchar2 )  --字符串,切割符
  5. --根据特定字符来切割字符串
  6. return strsplit_type_12
  7.   pipelined is
  8.   v_idx       integer;
  9.   v_str       varchar2(500);
  10.   v_strs_last varchar2(4000) := p_value;
  11. begin
  12.   loop
  13.     v_idx := instr(v_strs_last, p_split);
  14.     exit when v_idx = 0;
  15.     v_str       := substr(v_strs_last, 1, v_idx - 1);
  16.     v_strs_last := substr(v_strs_last, v_idx + 1);
  17.     pipe row(v_str);
  18.   end loop;
  19.   pipe row(v_strs_last);
  20.   return;
  21. end strsplit_66;
  22. SELECT ROWNUM 序号, a.* FROM TABLE(strsplit_66((select bs from cs1_0 where slid='201804100038'), ',')) a;
复制代码
测试一下:

总结

到此这篇关于Oracle以逗号分隔的字符串拆分为多行数据的文章就先容到这了,更多相干Oracle拆分多行数据内容请搜刮草根技术分享以前的文章或继续欣赏下面的相干文章盼望大家以后多多支持草根技术分享!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作