【问题标题】:Is there a way to replace accents with Teradata SQL?有没有办法用 Teradata SQL 替换重音符号?
【发布时间】:2021-01-23 21:36:01
【问题描述】:

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

例如:

  • 输入:São Paulo 输出:Sao Paulo
  • 输入:eéíãç 输出:eeiac

【问题讨论】:

  • 用您可能想要使用的编码更新了我的答案。请考虑为可能遇到类似问题的其他人在您的问题中添加额外的上下文/详细信息。
  • 如果它实际上是 all 变音符号 (en.wikipedia.org/wiki/…),这真的很难,您可能会创建一个巨大的列表并将 otranslate 用于基本字符。如果将它隐藏在 SQL UDF 中,它会很容易使用。但最好的解决方案可能是基于 C-UDF,搜索现有的 C 代码,然后您只需将其包装在 TD C-UDF 中
  • 感谢您的所有想法,因此我将继续尝试使用 Translate、SQL UDF 或 C-UDF
  • 基列的字符类型是什么?拉丁语还是 UNICODE?
  • 默认情况下,当我创建 varchar 列时,teradata 一直在设置 LATIN

标签: sql teradata teradata-sql-assistant


【解决方案1】:

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

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

006100B400E1 产生相同的字符,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) 重新组合它们以节省空间

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

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

【讨论】:

  • 我会检查您的答案,因为带有正则表达式的代码解决了我的示例,但是当我尝试使用您的示例时,它返回 This ?a a string with ?a?? ?iac?itic?,您知道会发生什么吗?
  • 原始字符串或替换字符串是这样的吗?检查您的会话字符集和客户端字体。
  • 替换后,我使用 ASCII 作为连接会话字符,我也尝试了 UTF8 但插入时出错:The string contains an untranslatable character。我不能使用 LATIN1250_1A0,因为它会引发:databases does not support...。我应该开始一个新问题吗?
  • 你的客户是什么?当然,ASCII 不支持其中一些字符,但 UTF-16 或 UTF-8 应该可以工作。 untranslatable 错误很奇怪,您在 when insert 时写道:您是否尝试将其插入到 LATIN 列中?
  • 注意,我的 Unicode 范围中有错字(缺少 x),这将删除附加字符,已修复。
猜你喜欢
  • 2023-03-29
  • 1970-01-01
  • 2012-02-19
  • 1970-01-01
  • 2018-09-23
  • 1970-01-01
  • 2013-02-21
  • 1970-01-01
相关资源
最近更新 更多