里面一个VARCHAR2列我有文本值,如:甲骨文拆分文本多行
aaaaaa. fgdfg.
bbbbbbbbbbbbbb ccccccccc
dddddd ddd dddddddddddd,
asdasdasdll
sssss
如果我从表做选择列其中id = ...我得到了一个单行的全部文本, 一般。 但我想在多行中得到结果,上面的例子是5。 我只需要使用一条select语句,并且分隔符将被换行或回车(oracle中的chr(10),chr(13))
谢谢!
里面一个VARCHAR2列我有文本值,如:甲骨文拆分文本多行
aaaaaa. fgdfg.
bbbbbbbbbbbbbb ccccccccc
dddddd ddd dddddddddddd,
asdasdasdll
sssss
如果我从表做选择列其中id = ...我得到了一个单行的全部文本, 一般。 但我想在多行中得到结果,上面的例子是5。 我只需要使用一条select语句,并且分隔符将被换行或回车(oracle中的chr(10),chr(13))
谢谢!
这样,也许(但一切都取决于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
由凯文·伯顿的回答包含一个错误,如果你的数据包含空线。 根据发明的解决方案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;
感谢您的回复。如果我运行你的例子,我得到五行+6更多至极为空。如果我运行我的实际测试数据,我只得到第一行。我使用oracle 10g – maephisto
我认为问题出在你使用的分隔符上。分离器应该是chr(10)或chr(13),而不是两者。 – maephisto
只是替换字符串中的一个chanracters,所以你正在寻找一个单一的分隔符.... –