Sql 从Snowflake中的字符串中删除重音符号

Sql 从Snowflake中的字符串中删除重音符号,sql,snowflake-cloud-data-platform,Sql,Snowflake Cloud Data Platform,我正在尝试删除Snowflake中字符串列中的所有重音。在MSSQL中,我可以使用collate函数来执行此操作。例如,我在一列中有一个字符串:“JESÚSSMITH12345”。我想删除U形上方的重音: 在MSSQL中,我可以执行以下操作: select ('JESÚSSMITH12345' Collate SQL_Latin1_General_CP1253_CI_AI) as identifier 返回:JesusMith12345 但是,除了使用TRANSLATE函数,我在Snowfla

我正在尝试删除Snowflake中字符串列中的所有重音。在MSSQL中,我可以使用collate函数来执行此操作。例如,我在一列中有一个字符串:“JESÚSSMITH12345”。我想删除U形上方的重音:

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

select ('JESÚSSMITH12345' Collate SQL_Latin1_General_CP1253_CI_AI) as identifier
返回:JesusMith12345

但是,除了使用TRANSLATE函数,我在Snowflake中找不到其他方法来实现这一点。使用TRANSLATE函数不是一个好的解决方案,因为我必须用重音定义每个可能的字母来进行翻译。例如,这适用于雪花:

select translate('JESÚSSMITH12345', 'Ú', 'U');
select collate('JESÚSSMITH12345', 'en-ai');  
返回:JesusMith12345

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

使用Snowflake中的collate函数,即使ai a.k.a不区分重音,它仍然返回带有重音U的字符串

例如,在雪花中:

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

返回:JESÚSSMITH12345

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


您唯一的选择是使用存储过程中的TRANSLATE函数或build等效函数,正如您所做的那样。您需要获取ascii值>=128的每个字符,并提供要替换的字符。您可以硬编码这个字符,或者为了更灵活,将重音字符以及您要将其转换为的字符放入一个表中,并在SP中使用它。您面临的问题是U和Ú是完全不同的字符,因此从编码/SQL的角度来看,从U上方删除重音的语句毫无意义


您唯一的选择是使用存储过程中的TRANSLATE函数或build等效函数,正如您所做的那样。您需要获取ascii值>=128的每个字符,并提供要替换的字符。您可以将其硬编码,或者为了更灵活,将重音字符和要将其转换为的字符放入一个表中,并在SP中使用它

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

select translate('JESÚSSMITH12345', 'Ú', 'U');
select collate('JESÚSSMITH12345', 'en-ai');  
创建或替换函数normalize_jsS字符串 返回字符串 语言JAVASCRIPT 作为“返回S.normalizeNFD.replace/[\u0300-\u036f]/g,;” ; 选择normalize_js'áèña'; -“伊埃娜”
我从中获得了JS代码。

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

select translate('JESÚSSMITH12345', 'Ú', 'U');
select collate('JESÚSSMITH12345', 'en-ai');  
创建或替换函数normalize_jsS字符串 返回字符串 语言JAVASCRIPT 作为“返回S.normalizeNFD.replace/[\u0300-\u036f]/g,;” ; 选择normalize_js'áèña'; -“伊埃娜” 我从你那里得到了JS代码