Есть ли способ заменить акценты на Teradata SQL?

#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-UDF

3. ценю все ваши мысли, и поэтому я продолжу пробовать, используя 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, которая удалит дополнительные символы, исправлено.