Snowflake中SELECT语句内将非ASCII/非英文字符替换为对应ASCII/英文的方法
Snowflake 非ASCII字符转英文/ASCII高效实现方案
方案1:使用内置TRANSLATE函数(性能最优、可读性最高)
TRANSLATE支持批量单字符映射,可一次性替换所有一对一的字符转换规则,仅需要单独处理ß这种单字符转多字符的特例,完全不需要嵌套多层REPLACE:
SELECT REPLACE( TRANSLATE( columnname, 'éêëèÉÈÊËðÐâàáãæàåÅÀÁÂÃÆäÄïîìíÌÍÎÏôòóõøÒÓÔÕØöÖûùúÙÚÛÜüñÑÇçýÿÝþÞ', 'eeeeEEEE DDaaaaaaAAAAAAaAiiiiIIIIoooooOOOOOoOuuuuUUUUunNCcyyYTt' ), 'ß', 'ss' ) AS replacement FROM mytable;
使用时只需保证TRANSLATE第二个参数的特殊字符顺序,和第三个参数的替换结果顺序一一对应即可,后续要加新的替换规则直接在两个字符串末尾加对应字符就行,维护成本极低。
方案2:使用Unicode标准化函数(通用全覆盖,无需手动枚举字符)
如果需要覆盖所有带重音的Unicode字符,不想手动枚举可能遗漏的特殊字符,可以用Snowflake内置的标准化函数配合正则实现:
SELECT REPLACE( REGEXP_REPLACE( NORMALIZE(columnname, NFD), '\\p{M}', '' ), 'ß', 'ss' ) AS replacement FROM mytable;
原理:
NORMALIZE(columnname, NFD)会把带重音的Unicode字符拆分为「基础ASCII字符+重音标记符」的组合形式,比如é会拆成e+独立的重音标记\\p{M}是Unicode专用匹配规则,可匹配所有重音标记类字符,直接替换为空即可一次性剥离所有重音- 最后单独处理
ß这类没有重音的特殊字符即可,有其他单转多的特殊字符可叠加REPLACE处理
两种方案都仅需要SELECT权限即可使用,无需写表权限,性能和可读性都远优于多层嵌套REPLACE的实现。
内容的提问来源于stack exchange,提问作者QMan5
相关产品推荐
相关产品推荐

