2011-11-03 55 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;