Удалить специальный символ chr(191) и другие SQL

Немного новичок в сценариях Unix и командах Oracle, так что будьте проще...

У меня есть поле, которое заполняется неправильными символами, особенно chr(191) 'inverted? знак'..

У меня был этот пример кода

UPDATE rc.rc_descripton
SET desc_description = 
                        (
                         CASE 
                            WHEN desc_description LIKE '%[^a-zA-Z0-9]%' 
                                  THEN Replace(REPLACE( desc_description, SUBSTRING( desc_description, PATINDEX('%[~,@,#,$,%,&,*,^,&,%,*,(,)]%', desc_description), 1 ),''),'-',' ')
                            ELSE desc_description
                          END
                         )

Хотя моя исходная команда UPDATE была: -

UPDATE rc.rc_description
SET    desc_description  = REPLACE(desc_description, CHR(191), ' ')
WHERE  desc_description LIKE '%' || CHR(191) || '%'

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

Я нашел unix-скрипт, который использовался ранее:

# Replace offending characters with the intending/valid characters 

sed s/–/-/g $1 | sed s/’/\'/g | sed s/‘/\'/g | sed s//\'/g | sed s//\'/g | sed s//\"/g | sed s//\"/g | sed s/“/\"/g | sed s/”/\"/g | sed s/—/-/g | sed s//-/g | sed s/…/.../g | sed s/‑/-/g | sed 's/½/1\/2/g' | sed 's/¼/1\/4/g' | sed 's/¾/3\/4/g' | sed 's/· //g' | sed s/°/./g | sed s/•/*/g | sed s/ //g > $1.out

Но я не могу перевести код unix в команду обновления Oracle.

пожалуйста, сообщите о правильной команде UPDATE, чтобы удовлетворить весь набор специальных символов, как указано выше, а также принять во внимание CHR (191) ...

с уважением, А.Б.


person abby    schedule 11.01.2016    source источник
comment
Перевернутый? расширен ASCII 168, а не 191? Возможно, вы просто видите этот символ, потому что ваш клиент не настроен для правильного отображения всех символов (UTF). Какой набор символов у вашей базы данных, клиента и сеанса операционной системы? И вы действительно уверены, что хотите удалить специальные символы и сократить сохраненный текст до US7ASCII?   -  person Alex Poole    schedule 11.01.2016
comment
Оригинальный тхт. Юнит 1 заявил: «МНЕ ТАК ИЗВИНЯЕТСЯ». XXXX не может получить полную версию от Unit 1 из-за ее травм и запроса QAS о том, что преобразованный текст: заявил: «МНЕ ТАК ИЗВИНИТЬ». XXXX не может получить полную версию из Unit 1 из-за Итак, в идеале я хочу увидеть исходный текст, но для версии 9i я не могу получить какие-либо эквивалентные функции, используемые в 10g или выше.   -  person abby    schedule 13.01.2016
comment
Какой у вас NLS_LANG или языковой стандарт операционной системы? И ваш набор символов базы данных? Это похоже на проблему с отображением - ваш клиент неправильно отображает символы Юникода. Предположительно, у вас есть «умные» кавычки, такие как ” “ ’ ‘, в сохраненной строке, и ваш клиент не знает, как их отображать, что обычно является проблемой настроек.   -  person Alex Poole    schedule 13.01.2016
comment
NLS_LANGUAGE AMERICAN NLS_TERRITORY AMERICA NLS_CURRENCY $ NLS_ISO_CURRENCY AMERICA NLS_NUMERIC_CHARACTERS ., NLS_CHARACTERSET WE8ISO8859P1 NLS_CALENDAR GREGORIAN NLS_DATE_FORMAT DD-MON-RR NLS_DATE_LANGUAGE AMERICAN NLS_SORT BINARY NLS_LENGTH_SEMANTICS BYTE NLS_NCHAR_CHARACTERSET AL16UTF16 NLS_RDBMS_VERSION 9.2.0.8.0   -  person abby    schedule 14.01.2016


Ответы (2)


У меня работает следующее утверждение: -

 select desc_description,
  length(dbms_lob.substr(desc_description, 3500, 1)) len,
  lengthb(dbms_lob.substr(desc_description, 3500, 1)) lenb,

  convert(replace(translate(dbms_lob.substr(desc_description, 3500, 1), ' abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-=`~!@#$%^&*()_+,./<>?;'':"[]\{}|',' '), ' ', ''),'us7ascii') bad_char_replaced,

  rawtohex(convert(replace(translate(dbms_lob.substr(desc_description, 3500, 1), ' abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-=`~!@#$%^&*()_+,./<>?;'':"[]\{}|',' '), ' ', ''),'us7ascii')) bad_char_replaced_hex ,
  -------
  convert(dbms_lob.substr(desc_description, 3500, 1),'us7ascii') converted
  -------
  from rc.rc_description

  WHERE  desc_description LIKE '%' || CHR(191) || '%' and
  desc_cras_number = '20140096849';

Предыдущий текст: B стойка автомобиля имеет ......

После текста: у транспортного средства B стойки есть ......

Могу ли я получить вышеуказанный запрос, чтобы удалить эти ??? в апостроф или двойные кавычки? или если это портит данные, то просто используйте пустое место.

person abby    schedule 13.01.2016

Попробуйте это Замените ввод своей строкой, а регулярное выражение для буквенно-цифрового, вы можете легко манипулировать им T-SQL SYNTAX

DECLARE @input AS NVARCHAR(MAX) = '124567890qwertyuioopasdfghjklzx cvbnm,;#$%^&*(!)$^'
DECLARE @output AS NVARCHAR(MAX) = @input
DECLARE @RegexString AS NVARCHAR(max) = '[^a-zA-Z0-9 ]'

WHILE PATINDEX('%'+@RegexString+'%',@output)>0
BEGIN
    SET     @output=  STUFF(@output,PATINDEX('%'+@RegexString+'%',@output),1,'')
    PRINT   @output
END

SELECT @input , @output
person Abdul Hannan Ijaz    schedule 11.01.2016
comment
Это не синтаксис Oracle. - person Alex Poole; 11.01.2016
comment
Да, я использую 9i, поэтому даже REGEX не работает... Пытался использовать OWA_PATTERN.AMATCH, но тщетно, любая подсказка о том, что я могу использовать для эквивалентной версии Oracle 9i - person abby; 13.01.2016