【问题标题】:Removing accents from string in Snowflake从雪花中的字符串中删除重音
【发布时间】:2021-06-10 20:45:45
【问题描述】:

我正在尝试从 Snowflake 中的字符串列中删除所有重音符号。在 MSSQL 中,我可以使用 collat​​e 函数来执行此操作。例如,我在一列中有这个字符串:'JESÚSSMITH12345'。我想去掉 U 上方的重音:

在 MSSQL 中,我可以执行以下操作:

select ('JESÚSSMITH12345' Collate SQL_Latin1_General_CP1253_CI_AI) as identifier

返回:JESUSSMITH12345

但是,除了使用 TRANSLATE 函数之外,我在 Snowflake 中找不到执行此操作的方法。使用 TRANSLATE 函数不是一个好的解决方案,因为我必须定义每个可能的带有重音符号的字母来进行翻译。例如,这适用于 Snowflake:

select translate('JESÚSSMITH12345', 'Ú', 'U');

返回:JESUSSMITH12345

但是,如果一列包含除带有重音符号的 U 以外的任何值,我必须将其添加到我的翻译中。这并不理想。

使用 Snowflake 中的 collat​​e 函数,即使使用“ai”(也称为不区分重音),这仍会返回带有重音 U 的字符串。

例如在雪花中:

select collate('JESÚSSMITH12345', 'en-ai');  

返回:JESÚSSMITH12345

【问题讨论】:

    标签: sql snowflake-cloud-data-platform


    【解决方案1】:

    更新:使用 Greg Pavlik 的 {Diacritic} 更好的 JS 行

    return str.normalize("NFD").replace(/\p{Diacritic}/gu, "");
    

    您可以使用 Snowflake 中的 JS UDF 解决此问题:

    CREATE OR REPLACE FUNCTION normalize_js(S string)
      RETURNS string
      LANGUAGE JAVASCRIPT
      AS 'return S.normalize("NFD").replace(/[\u0300-\u036f]/g, "");'
    ;
    
    select normalize_js('áéÉña');
    
    -- 'aeEna'
    

    我从 Remove accents/diacritics in a string in JavaScript 那里得到了那个 JS 代码。

    【讨论】:

    • 我刚刚意识到有一个更新的问题与这个问题重复。它在这里:stackoverflow.com/questions/69031822/…。我发现并使用了与 Felipe 相同的 JS,而且似乎有针对 Snowflake 支持的更高版本的 JavaScript 的更新。 .replace 现在可以使用(/\p{Diacritic}/gu, "") 覆盖整个范围。原来的表达漏掉了一些。
    【解决方案2】:

    您面临的问题是 U 和 Ú 是完全不同的字符,因此从编码/SQL 的角度来看,“删除 U 上方的重音”语句是没有意义的。

    您唯一的选择是像您所做的那样使用 TRANSLATE 函数(或在存储过程中构建等效功能)。您需要获取每个 ascii 值 >= 128 的字符,并提供要替换它的字符。您可以对此进行硬编码,或者为了获得更大的灵活性,将重音字符和您想要将它们翻译成的字符放入表格中并在您的 SP 中使用它

    【讨论】:

      猜你喜欢
      • 2021-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-21
      • 1970-01-01
      • 2019-12-25
      • 2021-10-19
      • 2014-06-04
      相关资源
      最近更新 更多