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.
Это должно работать для всех тех, кто хочет исключить странные закодированные символы из своих строк