• Oracle根据逗号拆分字段内容转成多行


    使用场景

    业务表A中一个字段存放用逗号分割的多个业务单元,现在需要将数据转成一个业务单元对应一个数据。

    1.业务表A

    SELECT * FROM app_template_dept t WHERE t.evaluate_index_code ='3330326';
    
    • 1

    在这里插入图片描述

    2.实现拆分SQL

    SELECT DISTINCT A.*, REGEXP_SUBSTR(A.DEPT_CODE, '[^,]+', 1, Level, 'i')
      FROM (SELECT *
              FROM APP_TEMPLATE_DEPT T
             WHERE T.EVALUATE_INDEX_CODE = '3330326') A
    CONNECT BY Level<= LENGTH(A.DEPT_CODE) -
               LENGTH(REGEXP_REPLACE(A.DEPT_CODE, ',', '')) + 1;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述

    3.REGEXP_SUBSTR函数

    对字符串进行正则分割,取特定字符的函数。

    1)参数说明

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

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

    • pattern:进行匹配的正则表达式

    • position:起始位置,从第几个字符开始正则表达式匹配(默认为1)
      注意:字符串最初的位置是1而不是0

    • occurrence:标识第几个匹配组,默认为1
      注意:分割后最初的字符串会按分割的顺序排列成组

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

    2)案例

    /*从第一个字符开始按照字符'A'(区分大小写)分割字符串'1a2A33a',取第二个分割出来的数据*/
    SELECT REGEXP_SUBSTR('1a2A33a','[^A]+',1,2,'c') AS STR FROM DUAL; --结果:33a
    
    SELECT REGEXP_SUBSTR('1a2A33a','[^A]+',1,2,'i') AS STR FROM DUAL; --结果:2
    
    /*把要输出来的第几个子串,通过一个变量ROWNUM转换成输出多少个子串。level<=5代表的是输出5个,没有的为null*/
    SELECT REGEXP_SUBSTR('1a2A33a','[^A]+',1,Level,'i') AS STR FROM DUAL CONNECT BY LEVEL<=5; --结果:1、2、33、null、null
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    4.REGEXP_REPLACE函数

    通过正则表达式来进行匹配替换。

    1)参数说明

    REGEXP_REPLACE(VARCHAR str, VARCHAR pattern, VARCHAR replacement)

    • str:指定的字符串
    • pattern:被替换的字符串
    • replacement:用于替换的字符串

    2)案例

    SELECT REGEXP_REPLACE('1a2A33a','A','') AS STR FROM DUAL; --结果:1a233a
    
    • 1

    5.CONNECT BY函数

    一般用来查找存在父子关系的数据,也就是树形结构的数据。

    1)基本语法

    select ... from
    
    where ... --过滤条件,用于对返回的所有记录进行过滤。
    
    [start with ...] --查询结果重起始根结点的限定条件。
    
    connect by [prior] id=parentid--连接条件
    ; 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • start with:用来限制第一层的数据,或者叫根节点数据,以这部分数据为基础来查找第二层数据,然后以第二层数据查找第三层数据以此类推。

    • connect by [prior] id=parentid :这部分是用来指明oracle在查找数据时以怎样的一种关系去查找,比如说查找第二层的数据时用第一层数据的id去跟表里面记录的parentid字段进行匹配,如果这个条件成立那么查找出来的数据就是第二层数据,同理查找第三层第四层…等等都是按这样去匹配。

    也可以写成connect by id= [prior] parentid,这种用法就表示从下往上查找数据,可以理解为从叶子节点往上查找父级几点,用第一层数据的parentid去跟表记录里面的id进行匹配,匹配成功那么查找出来的就是第二层数据;上面的那种就是从父级节点往下查找叶子节点。

    2)案例

    select rownum from dual connect by rownum<=10;
    
    • 1

    结果
    在这里插入图片描述

    select * from table_temp
    start with id = '001001'
    connect by prior id = parent_id;
    
    • 1
    • 2
    • 3

    table_temp表中数据
    在这里插入图片描述

    结果
    在这里插入图片描述

    6.LENGTH函数

    返回字符串表达式中字符数的字符串函数。

    1)参数说明

    LENGTH(string-expression)

    • string-expression:字符串表达式,可以是列名、字符串文字或另一个标量函数的结果,其中基础数据类型可以表示为任何字符类型(例如 CHAR 或 VARCHAR)

    2)案例

    SELECT LENGTH('1a2A33a') AS STR FROM DUAL; --结果:7
    
    • 1
  • 相关阅读:
    STM32MP135和STM32MP157的区别
    企业如何防备密码攻击
    D - All Assign Point Add
    iVX低代码平台系列详解 --界面功能(一)
    etoken是什么意思,有什么作用?
    基于springboot+vue社区疫情防控系统
    Java条件控制语句
    数据结构与算法训练:第二十六章
    NodeJs实战-待办列表(4)-解决待办事项中文乱码问题
    33. 搜索旋转排序数组
  • 原文地址:https://blog.csdn.net/qq_45988641/article/details/126260463