• Oracle中根据特定的分隔符拆分字段


    记录一下在Oracle数据库中碰到的问题。

    一、问题

    该问题的需求是查询最新时间段的一条数据并取出某一个栏位的值

    其中SEG07栏位的数据是用特殊符号  ^ 来区分。

    二、解决方案

    1、由于要选出最新的一条数据,将SEG07栏位中的数据进行降序排列

    2、将降序排列后的第一条数据显示(表数据太大,防止后续CONNECT BY循环时间过长,而且一条以上使用CONNECT BY就会卡死,不知道什么原因)

    3、将SEG07中的数据通过正则表达式筛选出来,并将分理出的数据循环排列,形成虚拟表

    三、方法实现

    使用REGEXP_SUBSTP方法

    REGEXP_SUBSTR函数格式如下:

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

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

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

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

    __occurrence :标识第几个匹配组,默认为1

    __modifier   :模式('i'不区分大小写进行检索;'c'区分大小写进行检索。默认为'c'。)

    CONNECT BY的一些用法可以查看这篇文章 https://blog.csdn.net/zwjzqqb/article/details/79066224

    具体语法如下:

    SELECT ID,CREATE_TIME,REGEXP_SUBSTR(SEG07,'[^^]+',1,LEVEL)SEG07 
    FROM (
    SELECT ID,CREATE_TIME,SEG07,SEG08  
    from(
    SELECT ID,CREATE_TIME,SEG07,SEG08 
    FROM TableName 
    WHERE SEG08= :VALUE
    ORDER BY CREATE_TIME_MS DESC)
    WHERE ROWNUM = 1)
    CONNECT BY LEVEL <= LENGTH (SEG07) - LENGTH (REPLACE (SEG07, '^','')) + 1;

    其中LENGTH (SEG07) - LENGTH (REPLACE (SEG07, '^','')) + 1是用来判断SEG07中字符串的个数的

    LENGTH (SEG07)是SEG07字符串的总长度,如:1^2^3的总长度就是5

    LENGTH (REPLACE (SEG07, '^',''))是通过REPLACE方法将SEG07中的分隔符去掉,如:1^2^3转换后=>123,这样长度就是3

    然后LENGTH (SEG07) - LENGTH (REPLACE (SEG07, '^','')) ,如:上述例子LENGTH (1^2^3) - LENGTH (REPLACE (1^2^3, '^','')) = 2,而其中的字符串为3,所以需要加一

    其实这个就相当于去数字符串中的分隔符然后加一

    REGEXP_SUBSTR(SEG07,'[^^]+',1,LEVEL)中的'[^^]+部分是正则表达式,其中[^^]+红色的部分是字符串的分隔符,可以为[^,]+,[^-]+等等

  • 相关阅读:
    Select loop
    shell学习
    硬链接与软连接的区别_(转)
    Windows 远程桌面连接Ubuntu16.04图像界面
    C# mysql 连接Apache Doris
    Hadoop 2.7.3 分布式集群安装
    ubuntu 16.04安装Chrome离线crx插件包
    RPC框架之Thrift分析(转)
    ubuntu 16.04安装ibus中文输入法
    secureCRT下linux rz命令上传文件失败或变小(破损)的问题解决方法
  • 原文地址:https://www.cnblogs.com/MoonASixpence/p/13729893.html
Copyright © 2020-2023  润新知