#database #db2 #special-characters #regexp-replace
#База данных #db2 #специальные символы #регулярное выражение-замена
Вопрос:
Мне нужно заменить специальные символы, такие как «VT» (вертикальная вкладка), новая строка, возврат каретки и т.д. При чтении из таблицы DB2 с нулевым значением.
Я вижу, что функция REGEXP_REPLACE не работает в DB2 или не принимает ее как функцию в предложении select .
Есть ли какой-либо способ заменить все специальные символы вообще на null ?
Комментарии:
1. Пожалуйста, отредактируйте свой вопрос, чтобы указать точное полное сообщение об ошибке («не работает» недостаточно, поскольку оно нам ничего не говорит), покажите также ваш SQL, который вызывает ошибку, и отметьте вашу серверную платформу Db2 (z / os, i-series, linux / unix / windows) и ее версию.
Ответ №1:
REGEXP
Функции принимают классы символов Unicode, а также диапазоны кодовых точек Unicode.
Возможно, вам потребуется определить, что вы классифицируете как «Специальный символ». Например. является £
специальным символом? Что насчет 😈
?
Если вы используете определение «управляющих» символов в Юникоде в наборе, который хотите удалить, вы можете использовать это для их удаления
REGEXP_REPLACE(your_column, '[p{Control}]*','')
Если вы хотите удалить, скажем, все символы, кроме, например, «простых» 7-разрядных эквивалентов ASCII для печати, вы можете использовать это
REGEXP_EXTRACT(your_column,'[^u0020-u007E] ','')
Это удалит все символы, которые не находятся между U 0020 SPACE
и U 007E TILDE
в Юникоде. Т.Е. Останется все, что является базовой латиницей https://en.wikipedia.org/wiki/List_of_Unicode_characters#Basic_Latin но все остальные кодовые точки будут удалены (включая, например £
, €
, À
и 😈
) .
Комментарии:
1. Привет, Пол, при использовании функции REGEXP_EXTRACT я получаю ошибку 440: SQL0440N Не найдена авторизованная процедура с именем «REGEXP_REPLACE» типа «», имеющая совместимые аргументы. SQLSTATE=42884.
2. Вы проверили, используете ли вы версию Db2, которая включает эту функцию? Это было новым в Db2 (для LUW) 11.1, например
3. Вам следует отредактировать свой пост, чтобы указать, какую версию вы используете
Ответ №2:
попробуйте использовать x’code ascii’ (cf: x’OA’ для LF), у меня это работает на DB2 LUW 11.5
db2 => select 'AE'||x'0A'||'MN' from sysibm.sysdummy1;
1
-----
AE
MN
замените LF на : —
db2 => select REGEXP_REPLACE('AE'||x'0A'||'MN',x'0A','-') from sysibm.sysdummy1;
1
-----------
AE-MN