замена специальных символов на null при чтении из таблицы DB2

#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