Функция Oracle REPLACE () не обрабатывает возврат каретки и перевод строки - PullRequest
21 голосов
/ 02 января 2009

У нас есть таблица со столбцом varchar2(100), которая иногда содержит возврат каретки и перевод строки. Мы хотели бы удалить эти символы в запросе SQL. Мы используем:

REPLACE( col_name, CHR(10) ) 

, который не имеет никакого эффекта , однако замена CHR (10) на более обычный символ «буква» доказывает, что функция REPLACE работает иначе. Мы также обнаружили, что

REPLACE( col_name, CHR(10), '_' ) 

находит местоположение новой строки, но вставляет подчеркивание после него, а не заменяет его.

Работает на Oracle8i. Обновление не вариант.

Ответы [ 6 ]

41 голосов
/ 02 января 2009

Другой способ - использовать ПЕРЕВОД :

TRANSLATE (col_name, 'x'||CHR(10)||CHR(13), 'x')

'x' - это любой символ, который вы не хотите переводить в ноль, потому что TRANSLATE не будет работать правильно, если третий параметр равен нулю.

24 голосов
/ 02 января 2009

Ахаха! Кейд на деньгах.

Артефакт в TOAD печатает \r\n в виде двух символов-заполнителей «blob», но печатает один \r также как два заполнителя. Первый шаг к решению - использовать ..

REPLACE( col_name, CHR(13) || CHR(10) )

.. но я выбрал чуть более надежный ..

REPLACE(REPLACE( col_name, CHR(10) ), CHR(13) )

.. который ловит оскорбительных символов в любом порядке. Большое спасибо Кейду.

М.

14 голосов
/ 02 января 2009

Вы уверены, что ваша новая строка не CHR(13) + CHR(10), и в этом случае вы получите CHR(13) + '_', который все еще может выглядеть как новая строка?

Попробуйте REPLACE(col_name, CHR(13) + CHR(10), '')

7 голосов
/ 02 января 2009

Если данные в вашей базе данных POSTED из HTML-элементов управления TextArea, разные браузеры используют разные символы новой строки:

Firefox разделяет строки только с CHR (10)

Internet Explorer разделяет строки с помощью CHR (13) + CHR (10)

Apple (pre-OSX) разделяет строки только с CHR (13)

Так что вам может понадобиться что-то вроде:

set col_name = replace(replace(col_name, CHR(13), ''), CHR(10), '')
1 голос
/ 24 июня 2015

Просто хотел оставить записку. У меня были проблемы с форматированием текстового поля 4000, которое имело собственный разум, и текст в отчете казался беспорядочным (или не). Когда я обновил столбец, используя замену chr (10), отмеченную выше. Мой отчет окончательно отформатирован так, как я хотел. Большое спасибо!

0 голосов
/ 08 ноября 2013

Если ваш символ новой строки CRLF, это означает, что за CHR(13) следует CHR(10). Если вы REPLACE(input, CHR(10), '_'), это превращается в CHR(13) с последующим подчеркиванием. Поскольку CR сам по себе может отображаться так же хорошо, как и символ новой строки, он будет показываться , как если бы после вашей новой строки было вставлено подчеркивание, но на самом деле только половина вашей новой строки была заменена.

Используйте REPLACE(REPLACE(input, CHR(13)), CHR(10)) для замены всех CR и LF.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...