Oracle regexp_replace очищает строку в запросе SQL, возвращая полный набор данных, а не просто несовпадающие строки

Я использую Oracle REGEXP_REPLACE для удаления всех нестандартных символов ascii (специальных) из поля свободного текста CLOB, которое клиент использует для хранения данных, некоторые пользователи копируют и вставляют из Excel, что вызывает проблемы при чтении текста из CLOB. Мне удалось избавиться от всех специальных символов и сохранить макет для абзацев и т. Д.

У меня возникает проблема, когда я сравниваю очищенное поле с исходным, после преобразования в строку символов, конечно, это то, что он возвращает строки, между которыми нет разницы, я вытащил оба значения и нет разницы в большинство случаев. Он возвращает весь набор данных, а не только те, которые были очищены. У меня закончились идеи

К вашему сведению, большая часть поддержания макета означает, что мне нужно сохранить возврат каретки CHR(13)

Ниже приведен запрос

select *
from (
select incident, entity,
trim(to_char(textarea)) textarea,
trim(to_char(regexp_replace(textarea,'[^' || CHR(13) || CHR(32) || '-' || CHR(126) || ']',''))) regexp_text
from response
) tab
where tab.regexp_text <> tab.textarea

Я попытался несколько различных комбинаций с обрезкой пробелов и подстрокой меньших строк и т. Д. Без удачи

3 ответа

WITH data ( value ) AS (
  SELECT 'éklzéiuhkn' FROM DUAL
)
SELECT REGEXP_REPLACE( value, '[^\r -~]', '' )
FROM   data;

Выходы:

REGEXP_R
--------
klziuhkn

Таким образом, ваш запрос должен быть примерно таким:

SELECT *
FROM   (
  SELECT incident,
         entity,
         TRIM( textarea ) AS textarea,
         TRIM( REGEXP_REPLACE( textarea, '[^\r -~]', '' ) ) AS regexp_text
  FROM   response
)
WHERE textarea <> regexp_text;

Ваша модель: '[^' || CHR(13) || CHR(32) || '-' || CHR(126) || ']',

Каретка (^) заменяет все, что не является специальным символом, пустой строкой. С настройками Oracle по умолчанию я бы ожидал, что это вернет пустую строку, которая рассматривается как NULL - но это будет означать, что ничего не возвращается.

В любом случае попробуйте снять каретку:

trim(to_char(regexp_replace(textarea, '[CHR(13) || CHR(32) || '-' || CHR(126) || ']',' '))) as regexp_text

Я наконец понял это, проблема заключалась в форматировании строк сравнения в where Предложение о включении всех символов Ascii и сопоставлении с регулярным выражением, которое я планировал использовать, было единственным способом устранения поддельных и невидимых закодированных символов.

select incident, entity,
regexp_replace(textarea,'[^' || CHR(13) || ' -}‘-~À-ü]',''))) regexp_text
regexp_replace(textarea,'[^' || CHR(13) || CHR(32) || '-' || CHR(125) || CHR(145) || '-' || CHR(152) || CHR(192) || '-' || CHR(252) || ']','') regexp_text2
from response
where to_char(regexp_replace(textarea,'[^' || CHR(163) || CHR(1) || '-' || CHR(125) || CHR(145) || '-' || CHR(152) || CHR(192) || '-' || CHR(252) || ']','')) <> to_char(regexp_replace(textarea,'[^' || CHR(1) || '-' || CHR(255) || ']',''))

Я включил обе строки, чтобы показать простое регулярное выражение '[^' || CHR(13) || ' -}‘-~À-ü]' так же хорошо как CHR(x) версия. Мне также нужно было включить латинские символы в конце.

По какой-то причине использование только CHR() при указании символов ascii работает 100% времени, я думаю, это может быть связано с настройкой окружения NLS_LANG.

Это должно работать для всех тех, кто хочет исключить странные закодированные символы из своих строк

Другие вопросы по тегам