Sybase: как я могу удалить непечатаемые символы из полей CHAR или VARCHAR с помощью SQL? - PullRequest
0 голосов
/ 11 февраля 2010

Я работаю с базой данных Sybase, которая, кажется, содержит непечатаемые символы в некоторых строковых полях, и это отбрасывает часть нашего кода обработки. На первый взгляд, это были только переводы строк и возврат каретки, но у нас также есть код ASCII 27 - символ ESC, некоторые акцентированные символы и некоторые другие странности.

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

В идеале мне бы хотелось иметь функцию, позволяющую передавать список символов, и просто сделать так, чтобы Sybase возвращала данные с удалением этих символов. Я хотел бы, чтобы это было чем-то, что мы могли бы сделать в простом SQL, если это возможно.

Примерно так, чтобы удалить символы, которые являются ASCII 0 - 31.

выберите str_replace (FIELD1, (0-31), NULL) в качестве FIELD1, str_replace (FIELD2, (0-31), NULL) как FIELD2 из ТАБЛИЦЫ

Пока что str_replace - самое близкое, что я могу найти, но это позволяет только заменить одну строку другой. Не поддерживает диапазоны символов и не позволит мне сделать выше.

Мы работаем на Sybase ASE 12.5 на серверах Unix.

1 Ответ

1 голос
/ 11 февраля 2010

Примерно так работает в SQL Server, который использует T-SQL, как Sybase:

while @@ROWCOUNT > 0
    UPDATE TheTable
    SET strColumn = REPLACE(strColumn, SUBSTRING(strColumn, 
        PATINDEX('%[^a-zA-Z0-9 ]%', 
        strColumn collate Latin1_General_BIN), 1), '')
    WHERE PATINDEX('%[^a-zA-Z0-9 ]%', 
        strColumn collate Latin1_General_BIN) <> 0

Функция patindex как минимум существует в Sybase.

Сортировка требуется для соответствия двоичного файла; в противном случае [a] будет соответствовать 'á'.

...