有没有办法用Teradata SQL代替重音符号?

问题描述

我有一个varchar列,我想用普通字母替换所有diacritics

例如:

  • 进入:São Paulo离开:Sao Paulo
  • 进入:eéíãç离开:eeiac

解决方法

一个变音符是一个复合字符,即可以是基本字符加变音符,例如

   'a' +  '´' =  'á'
  0061 + 00B4 = 00E1   
    

006100B400E1都产生相同的字符,Unicode允许使用Teradata支持的 normalization 函数来回切换:

translate(string using UNICODE_TO_UNICODE_NFD)

将复合字符分解为单独的字符。那些组合变音标记位于从U + 0300到U + 036F的Unicode块中。

现在分解输入并应用正则表达式以删除此范围内的字符:

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)

来节省空间。

如果您输入的字符串具有拉丁字符集,则可能会更容易找到有限的变音字符列表并应用翻译:

oTranslate(str,'àáâãäåÀÁÂÃÄÅÇ...','aaaaaaAAAAAAC...')