Oracle разбивает текст на несколько строк - PullRequest
2 голосов
/ 03 ноября 2011

Внутри столбца varchar2 у меня есть текстовые значения, такие как:

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

если я делаю выбрать столбец из таблицы, где id = ... я получаю весь текст в одной строке, обычно.Но я хотел бы получить результат в несколько строк, 5 для примера выше.Я должен использовать только один оператор выбора, и разделителями будут новая строка или возврат каретки (chr (10), chr (13) в oracle)

Спасибо!

Ответы [ 2 ]

3 голосов
/ 03 ноября 2011

Примерно так (возможно, но все зависит от используемой вами версии 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

см .: Значения, разделенные запятыми в Oracle

0 голосов
/ 14 августа 2015

Ответ Кевина Бертона содержит ошибку, если ваши данные содержат пустые строки.Адаптация ниже, основанная на изобретенном решении здесь , работает.Проверьте этот пост для объяснения проблемы и решения.

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;
...