2017-05-22 6 views
1

でREGEXP_SUBSTRを使用してOracleでの分割文字列私は、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 ; 
をSUBSTRINGの順序は私にとって非常に重要であるため、

bbb 
aaa 
qqq 
ccc 

私は順番にそれを分割したい、私はいつも、以下の出力を期待しました。しかし、このクエリの結果は、順番ではありません。

qqq 
aaa 
bbb 
ccc 

答えて

3

あなたの結果を得るためにDISTINCTは必要ありません。あなたが必要な場合は

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:以外にも、与えられた順序で結果を得るために、あなたが必要とするすべてはORDER BY句です

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