Split string in Oracle with regexp_substr in order

前端 未结 2 1166
梦谈多话
梦谈多话 2021-01-24 03:29

I have a string in Oracle database, my string is: \'bbb;aaa;qqq;ccc\'

I used regexp for split my string:

select distinct trim(regexp_substr(\'bbb;aaa;qqq         


        
相关标签:
2条回答
  • 2021-01-24 04:10

    If you do need 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;
    

    Output:

    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
    
    0 讨论(0)
  • 2021-01-24 04:25

    You don't need a DISTINCT to get your result; besides, to get the result in a given order, all you need is an ORDER BY clause:

    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
    
    0 讨论(0)
提交回复
热议问题