2011-11-03 60 views
1

里面一个VARCHAR2列我有文本值,如:甲骨文拆分文本多行

aaaaaa. fgdfg. 
bbbbbbbbbbbbbb ccccccccc 
dddddd ddd dddddddddddd, 
asdasdasdll 
sssss 

如果我从表做选择列其中id = ...我得到了一个单行的全部文本, 一般。 但我想在多行中得到结果,上面的例子是5。 我只需要使用一条select语句,并且分隔符将被换行或回车(oracle中的chr(10),chr(13))

谢谢!

回答

2

这样,也许(但一切都取决于Oracle版本您正在使用):

WITH yourtable AS (SELECT REPLACE('aaaaaa. fgdfg.' ||chr(10)||   
         'bbbbbbbbbbbbbb ccccccccc ' ||chr(13)|| 
         'dddddd ddd dddddddddddd,' ||chr(10)|| 
         'asdasdasdll ' ||chr(13)|| 
         'sssss '||chr(10),chr(13),chr(10)) AS astr FROM DUAL) 
SELECT REGEXP_SUBSTR (astr, '[^' ||chr(10)||']+', 1, LEVEL) data FROM yourtable 
CONNECT BY LEVEL <= LENGTH(astr) - LENGTH(REPLACE(astr, chr(10))) + 1 

见:Comma Separated values in Oracle

+0

感谢您的回复。如果我运行你的例子,我得到五行+6更多至极为空。如果我运行我的实际测试数据,我只得到第一行。我使用oracle 10g – maephisto

+0

我认为问题出在你使用的分隔符上。分离器应该是chr(10)或chr(13),而不是两者。 – maephisto

+0

只是替换字符串中的一个chanracters,所以你正在寻找一个单一的分隔符.... –

0

由凯文·伯顿的回答包含一个错误,如果你的数据包含空线。 根据发明的解决方案here进行的改编工作。请检查该帖子,了解有关问题和解决方案的说明。

WITH yourtable AS (SELECT REPLACE('aaaaaa. fgdfg.' ||chr(10)||   
        'bbbbbbbbbbbbbb ccccccccc ' ||chr(13)|| 
        chr(13)|| 
        'dddddd ddd dddddddddddd,' ||chr(10)|| 
        'asdasdasdll ' ||chr(13)|| 
        'sssss '||chr(10),chr(13),chr(10)) AS astr FROM DUAL) 
SELECT REGEXP_SUBSTR (astr, '([^' ||chr(10)||']*)('||chr(10)||'|$)', 1, LEVEL, null, 1) data FROM yourtable 
CONNECT BY LEVEL <= LENGTH(astr) - LENGTH(REPLACE(astr, chr(10))) + 1;