Функция Oracle REPLACE() не обрабатывает возврат каретки и линейные каналы

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

REPLACE( col_name, CHR(10) ) 

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

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

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

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

Ответ 1

Другой способ - использовать TRANSLATE:

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

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

Ответ 2

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

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

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

.. но я выбрал немного более надежный.

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

.., который ловит нарушителей символов в любом порядке. Огромное спасибо Кейду.

М.

Ответ 3

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

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

Ответ 4

Если данные в вашей базе данных отправлены из формы 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), '')

Ответ 5

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

Ответ 6

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

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