问题描述
我有一个varchar
列,我想用普通字母替换所有diacritics
例如:
- 进入:
São Paulo
离开:Sao Paulo
- 进入:
eéíãç
离开:eeiac
解决方法
一个变音符是一个复合字符,即可以是基本字符加变音符,例如
'a' + '´' = 'á'
0061 + 00B4 = 00E1
006100B4
和00E1
都产生相同的字符,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...')