2017-05-22 86 views
1

我在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 

回答

3

你并不需要一个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 
1

如果确实需要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