Как заменить новую строку и перевод строки определенным образом

У меня есть приведенные ниже данные в столбце, называемом «ДАННЫЕ» в оракуле. Я пытался удалить новую пустую строку после каждой строки.

  • Вход

    This is a text from line 1.
    
    This is text from line 2.
    
    This is a text from line 3.The line 3 ends here .
    
    This is a text from line 4.The line ends here .
    
  • выход

    This is a text from line 1.
    This is text from line 2.
    This is a text from line 3.The line 3 ends here .
    This is a text from line 4.The line ends here .
    

я пытался использовать

Запрос :

Select regexp_replace(regexp_replace(data,chr(13),null),chr(10),null) from main_data;

Когда я выполняю приведенный ниже запрос, вывод похож на абзац.

Это текст из строки 1. Это текст из строки 2. Это текст из строки. Здесь заканчивается строка 3. Это текст из строки 4. Здесь заканчивается строка.

Кто-нибудь может сказать, как этого добиться?


person Rak kundra    schedule 20.06.2018    source источник
comment
Вы пробовали это: stackoverflow.com/a/25693951/7998591?   -  person Kaushik Nayak    schedule 20.06.2018


Ответы (3)


Вы можете использовать регулярное выражение '(' || chr(13) || chr(10) || '?|' || chr(10) || '){2,}':

select regexp_replace(
    'This is a text from line 1.' || chr(13) || chr(10) || chr(13) || chr(10) || 'This is text from line 2.' || chr(10)  || chr(10) || 'This is a text from line 3.The line 3 ends here .'  || chr(10) || chr(10) || 'This is a text from line 4.The line ends here .',
    '(' || chr(13) || chr(10) || '?|' || chr(10) || '){2,}',
    '\1') as Result from dual

Шаблон соответствует 2 или более ({2,}) последовательным повторениям символа CR, за которым следует необязательный (1 или ноль, ?) символ LF или (|) символ LF.

Совпадение заменяется единственным, последним совпавшим вхождением CRLF, CR или LF, поскольку \1 является заполнителем для значения, захваченного с помощью группы захвата #1 (первая конструкция (...) в шаблоне).

Вывод онлайн-демонстрации:

введите здесь описание изображения

person Wiktor Stribiżew    schedule 20.06.2018
comment
Идеально . Это работает как магия. В запросе, который вы предоставили ('\1'), почему мы используем это? . - person Rak kundra; 20.06.2018
comment
@SanthoshPogaku Регулярное выражение соответствует 2 или более последовательным разрывам строк, и если мы заменим их на '', мы удалим их и объединим все строки в 1. Нам нужно заменить разрыв строки, и я показал, как мы можем повторно использовать захваченный значение в замене (см. \1 — это заполнитель для значения, захваченного с помощью группы захвата #1 (первая конструкция (...) в шаблоне)). Вы можете жестко запрограммировать его на chr(10) или char(13) || chr(10), если хотите. - person Wiktor Stribiżew; 20.06.2018
comment
Кстати, вы можете использовать '(' || chr(13) || chr(10) || '?|' || chr(10) || '){2,}' для сопоставления всех распространенных окончаний разрыва строки: CRLF, LF или CR. - person Wiktor Stribiżew; 20.06.2018
comment
Спасибо за решения и объяснение, это решение отлично подходит для моего вопроса. ты. - person Rak kundra; 20.06.2018

Если поля пусты или NULL используйте ниже.

SELECT DATA
FROM main_data
WHERE DATA IS NOT NULL OR DATA != ''
person Matt    schedule 20.06.2018
comment
[ДАННЫЕ != ''] является избыточным. Это никогда не бывает истинным, потому что '' считается нулевым в Oracle. - person Maxim Borunov; 20.06.2018
comment
Похоже, что ОП говорит об одном значении строки, которое представляет собой строку со встроенными пустыми строками; не несколько строк, некоторые из которых являются нулевыми. - person Alex Poole; 20.06.2018

Как насчет того, чтобы заменить появление последовательных маркеров конца строки только одним.

DECLARE

  DATA VARCHAR2(2000);
BEGIN
  DATA := 'This is a text from line 1.' || CHR(13) || CHR(13) ||
          'This is text from line 2.' || CHR(13) || CHR(13) ||
          'This is a text from line 3.The line 3 ends here .' || CHR(13) ||CHR(13) ||
          'This is a text from line 4.The line ends here .';

  dbms_output.put_line(regexp_replace(DATA, chr(13) || CHR(13), CHR(13)));

END;

Это даст вам

This is a text from line 1.
This is text from line 2.
This is a text from line 3.The line 3 ends here .
This is a text from line 4.The line ends here .
person Visionary Zen    schedule 20.06.2018