【问题标题】:Split string in Oracle with regexp_substr in order在 Oracle 中使用 regexp_substr 按顺序拆分字符串
【发布时间】:2017-05-22 07:05:05
【问题描述】:

我在Oracle数据库中有一个字符串,我的字符串是:'bbb;aaa;qqq;ccc'

我使用正则表达式来拆分我的字符串:

select distinct trim(regexp_substr('bbb;aaa;qqq;ccc','[^;]+', 1,level) ) as q 
from dual
connect by regexp_substr('bbb;aaa;qqq;ccc', '[^;]+', 1, level) is not null ;

我想按顺序拆分它,我希望总是下面的输出:

bbb
aaa
qqq
ccc

因为子字符串的顺序对我来说非常重要。但是这个查询的结果不按顺序:

qqq
aaa
bbb
ccc

【问题讨论】:

    标签: sql oracle oracle11g


    【解决方案1】:

    您不需要DISTINCT 即可获得结果;此外,要按给定顺序获得结果,您只需要一个 ORDER BY 子句:

    select trim(regexp_substr('bbb;aaa;qqq;ccc','[^;]+', 1,level) ) as q 
    from dual
    connect by regexp_substr('bbb;aaa;qqq;ccc', '[^;]+', 1, level) is not null
    order by level
    

    【讨论】:

      【解决方案2】:

      如果你确实需要DISTINCT:

      WITH your_data( value ) AS (
        SELECT 'bbb;aaa;qqq;ccc;aaa;eee' FROM DUAL
      ),
      positions ( string, lvl, start_pos, end_pos ) AS (
        SELECT value, 1, 1, INSTR( value, ';', 1, 1 ) FROM your_data
      UNION ALL
        SELECT string, lvl + 1, end_pos + 1, INSTR( string, ';', 1, lvl + 1 )
        FROM positions
        WHERE  end_pos > 0
      ),
      substrings ( string, substring, lvl, start_pos ) AS (
        SELECT string,
               DECODE( end_pos, 0, SUBSTR( string, start_pos ), SUBSTR( string, start_pos, end_pos - start_pos ) ),
               lvl,
               start_pos
        FROM   positions
      )
      SELECT string,
             substring,
             lvl
      FROM   substrings
      WHERE  INSTR( ';' || string || ';', ';' || substring || ';' ) = start_pos;
      

      输出

      STRING                  SUBSTRING                      LVL
      ----------------------- ----------------------- ----------
      bbb;aaa;qqq;ccc;aaa;eee bbb                              1
      bbb;aaa;qqq;ccc;aaa;eee aaa                              2
      bbb;aaa;qqq;ccc;aaa;eee qqq                              3
      bbb;aaa;qqq;ccc;aaa;eee ccc                              4
      bbb;aaa;qqq;ccc;aaa;eee eee                              6
      

      【讨论】:

        猜你喜欢
        • 2015-10-17
        • 2022-11-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-08
        • 2021-07-14
        • 2012-06-26
        相关资源
        最近更新 更多