我正在尝试删除Snowflake中字符串列中的所有重音。在MSSQL中,我可以使用collate函数来完成此操作。例如,我在一个列中有这个字符串:‘JES?SSMITH12345’。我想去掉U上方的重音符号:
在MSSQL中,我可以执行以下操作:
select ('JESÚSSMITH12345' Collate SQL_Latin1_General_CP1253_CI_AI) as identifier返回:JESUSSMITH12345
但是,除了使用TRANSLATE函数之外,我找不到在Snowflake中执行此操作的方法。使用翻译函数不是一个好的解决方案,因为我必须用重音来定义每个可能的字母来进行翻译。例如,这在Snowflake中有效:
select translate('JESÚSSMITH12345', 'Ú', 'U');返回:JESUSSMITH12345
但是,如果列包含除U以外的任何带重音的值,我必须将其添加到我的翻译中。这并不理想。
使用Snowflake中的collate函数,即使使用"ai“(也就是不区分重音的),它仍然会返回带有重音U的字符串。
例如在Snowflake中:
select collate('JESÚSSMITH12345', 'en-ai'); 返回:JESÚSSMITH12345
发布于 2021-03-13 04:41:23
更新:使用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代码。
发布于 2021-03-13 04:27:34
您面临的问题是,U和ª是完全不同的字符,因此从编码/SQL的角度来看,“从U上方删除重音”这句话是没有意义的。
惟一的选择是使用TRANSLATE函数(或者在存储过程中构建等效功能),就像您已经做的那样。您需要获取ASCII值为>= 128的每个字符,并提供要用其替换的字符。您可以对此进行硬编码,或者,为了获得更大的灵活性,可以将重音字符和您想要将其转换为的字符放入一个表中,并在SP中使用
https://stackoverflow.com/questions/66606576
复制相似问题