2016-05-19 5 views
0

Я нашел множество вопросов, подобных этому, но ни один из них не подходит для меня на 100%. У меня есть Oracle 11g выразитьоракул разделен запятой цитата строка

у меня есть эта строка

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

это означает, как правило, запятая разделяет данные, но может быть пустыми данные (даже больше в серии), и если есть запятая в данном он цитируется.

до сих пор лучший р ехр является то, что один

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

, но это ставит в конце всех пустых данных с помощью этого запроса

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

Is [это] (http://stackoverflow.com/a/35502233/266304), на который вы уже посмотрели? Это использует замену, а не regexp_replace, чтобы поставить фиктивное значение в ... –

+0

Да, такого рода замена действительно хорошая идея – pillesoft

ответ

2

Это похоже на работу и обрабатывает NULLs:

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

 Смежные вопросы

  • Нет связанных вопросов^_^