#sql #teradata #teradata-sql-assistant
#sql #teradata #teradata-sql-assistant
Вопрос:
У меня есть varchar
столбец, и я хочу заменить все диакритические знаки обычными буквами
Например:
- Вход:
São Paulo
выход:Sao Paulo
- Вход:
eéíãç
выход:eeiac
Комментарии:
1. Обновил мой ответ кодировкой, которую вы, возможно, захотите использовать. Пожалуйста, рассмотрите возможность добавления дополнительного контекста / деталей к вашему вопросу для других, которые могут столкнуться с подобными проблемами.
2. Если это на самом деле все диакритические знаки ( en.wikipedia.org/wiki /… ) это действительно сложно, вы можете создать огромный список и
otranslate
для базового символа. Если вы спрячете его в UDF SQL, его будет легко использовать. Но лучшее решение, вероятно, основано на C-UDF, выполните поиск существующего C-кода для этого, а затем вам просто нужно обернуть его в TD C-UDF3. ценю все ваши мысли, и поэтому я продолжу пробовать, используя Translate, SQL UDF или C-UDF
4. Какой тип символов базового столбца? ЛАТИНИЦА или ЮНИКОД?
5. По умолчанию teradata устанавливает LATIN при создании столбцов varchar
Ответ №1:
Диакритический символ является составным символом, т. Е. Может быть базовым символом плюс диакритический знак, например
'a' '´' = 'á'
0061 00B4 = 00E1
Оба 006100B4
и 00E1
приводят к одному и тому же символу, Unicode позволяет переключаться назад и вперед, используя функции нормализации, которые поддерживаются Teradata:
translate(string using UNICODE_TO_UNICODE_NFD)
разлагает составной символ на отдельные символы. Те, которые сочетают диакритические знаки, находятся в блоке Unicode в диапазоне от U 0300 до U 036F.
Теперь разложите входные данные и примените регулярное выражение для удаления символов из этого диапазона:
select
'Ťĥïŝ ẅåš á şťŕĭńġ ŵïţĥ ḿäṇȳ ḓìāčṝĩţïĉș' as str,
REGEXP_REPLACE(translate(str using UNICODE_TO_UNICODE_NFD) -- decomposed input
,'[x{0300}-x{036F}]' -- diacritics
,'')
ВОЗВРАТ
Ťĥïŝ ẅåš á şťŕĭńġ ŵïţĥ ḿäṇȳ ḓìāčṝĩţïĉș
This was a string with many diacritics
Если есть другие разлагаемые символы, вам может потребоваться составить их снова, чтобы сэкономить место, используя другой translate(... using UNICODE_TO_UNICODE_NFC)
Если вы вводите строку с латинской кодировкой, может быть проще найти ограниченный список диакритических символов и применить translate:
oTranslate(str, 'àáâãäåÀÁÂÃÄÅÇ...', 'aaaaaaAAAAAAC...')
Комментарии:
1. Я проверю ваш ответ, потому что этот код с регулярным выражением решил мои примеры, но когда я попробовал с вашим примером, он возвращается
This ?a a string with ?a?? ?iac?itic?
, вы знаете, что может произойти?2. Выглядит ли исходная или замененная строка так? Проверьте свой набор символов сеанса и ваш клиентский шрифт.
3. замененный, я использовал ASCII в качестве символа сеанса подключения, также я попробовал UTF8, но при вставке возникла ошибка:
The string contains an untranslatable character
. Я не могу использовать LATIN1250_1A0, потому что он вызывает :databases does not support...
. Должен ли я начать новый вопрос?4. Какой у вас клиент? Конечно, ASCII не поддерживает некоторые из этих символов, но UTF-16 или UTF-8 должны работать. Странная непереводимая ошибка, которую вы написали при вставке : вы пытались вставить ее в латинский столбец?
5. Внимание, у меня была опечатка (отсутствует x) в моем диапазоне Unicode, которая удалит дополнительные символы, исправлено.