2016-05-19 30 views
0

私はこのような質問がたくさんありましたが、どれも100%適切ではありません。私はOracleは、私がoracleをコンマで区切って引用符で囲んだ文字列

'abcd,123,,defoifcd,"comma, in string",87765,,,hello' 

が、それはカンマでデータを分離し、通常意味する文字列を持っている

を表現11Gが、(さらに直列に)空のデータ可能性があり、コンマはデータ内に存在する場合それは引用されています。

は、これまで最高のREG expがあり、1つの

'("[^"]*"|[^,]+)' 

が、これは

with test as 
(select 
'abcd,123,,defoifcd,"comma, in string", 87765,,,hello' 
str from dual 
) 
select REGEXP_SUBSTR(str, '("[^"]*"|[^,]+)', 1, rownum) split 
from test 
connect by level <= length (regexp_replace (str, '("[^"]*"|[^,]+)')) + 1; 

は私もと空のデータを交換しようとしたそのクエリを使用して、空のすべてのデータの最後に置きます、該当なし、そうすること

'abcd,123,n/a,defoifcd,"comma, in string",87765,n/a,n/a,hello' 

しかし、regexp_replaceは空の最初の出現のみを置き換えますデータ

select 
regexp_replace('abcd,123,,defoifcd,"comma, in string",87765,,,hello', '(,,)', ',n/a,') 
str from dual; 

ありがとうございました!

+0

は[この](http://stackoverflow.com/a/35502233/266304 )あなたはすでに見ていた?それはregexp_replaceではなくダミー値を入れて置き換えて使用しています... –

+0

うん、そのようなものは確かに良いアイデアを置き換える – pillesoft

答えて

2

これが動作しているようですし、NULLを扱う:

SQL> with test as 
    (select 
    'abcd,123,,defoifcd,"comma, in string", 87765,,,hello' 
    str from dual 
    ) 
    select trim('"' from REGEXP_SUBSTR(str, '(".*?"|.*?)(,|$)', 1, level, NULL, 1)) split 
    from test 
    connect by level<=length(regexp_replace(str,'".*?"|[^,]*'))+1; 

SPLIT 
---------------------------------------------------- 
abcd 
123 

defoifcd 
comma, in string 
87765 


hello 

9 rows selected. 

SQL> 

この投稿は、ソリューションの推進力を提供する:https://community.oracle.com/thread/528107?tstart=0

関連する問題