Redshift SQL查询需求:系统移除人名中的重音、变音符号等特殊字符
Redshift SQL批量移除重音、变音符号及特殊字符方案
Redshift没有像SQL Server那样通过COLLATE直接去除重音的原生支持,要系统性统一处理带重音的人名(比如François转Francois、ñ转n),可以用以下两种实用方法:
方法1:直接使用TRANSLATE函数做字符映射
通过TRANSLATE函数建立带重音字符与对应无重音字符的映射表,一次性替换所有目标字符:
SELECT t1.name AS name_with_accents, t2.name AS name_without_accents, -- 统一标准化人名 TRANSLATE( t1.name, 'áàâäãåéèêëíìîïóòôöõúùûüñçÁÀÂÄÃÅÉÈÊËÍÌÎÏÓÒÔÖÕÚÙÛÜÑÇ', 'aaaaaaeeeeiiiiooooouuuuncAAAAAAEEEEIIIIOOOOOUUUUUNC' ) AS normalized_name_t1, TRANSLATE( t2.name, 'áàâäãåéèêëíìîïóòôöõúùûüñçÁÀÂÄÃÅÉÈÊËÍÌÎÏÓÒÔÖÕÚÙÛÜÑÇ', 'aaaaaaeeeeiiiiooooouuuuncAAAAAAEEEEIIIIOOOOOUUUUUNC' ) AS normalized_name_t2 FROM table_with_accents t1 JOIN table_without_accents t2 ON TRANSLATE(t1.name, 'áàâäãåéèêëíìîïóòôöõúùûüñçÁÀÂÄÃÅÉÈÊËÍÌÎÏÓÒÔÖÕÚÙÛÜÑÇ', 'aaaaaaeeeeiiiiooooouuuuncAAAAAAEEEEIIIIOOOOOUUUUUNC') = TRANSLATE(t2.name, 'áàâäãåéèêëíìîïóòôöõúùûüñçÁÀÂÄÃÅÉÈÊËÍÌÎÏÓÒÔÖÕÚÙÛÜÑÇ', 'aaaaaaeeeeiiiiooooouuuuncAAAAAAEEEEIIIIOOOOOUUUUUNC');
优缺点
- 优点:无需创建额外数据库对象,写法直接,适合临时查询或一次性处理场景。
- 缺点:需要手动覆盖所有可能的重音字符,若遇到少见的Unicode特殊字符,需自行扩展映射表的字符对。
方法2:封装自定义标量函数(推荐频繁使用场景)
将字符映射逻辑封装成自定义函数,方便重复调用,后续维护也更便捷:
-- 创建去重音函数 CREATE OR REPLACE FUNCTION fn_remove_accents(input_text VARCHAR) RETURNS VARCHAR IMMUTABLE AS $$ BEGIN RETURN TRANSLATE( input_text, 'áàâäãåéèêëíìîïóòôöõúùûüñçÁÀÂÄÃÅÉÈÊËÍÌÎÏÓÒÔÖÕÚÙÛÜÑÇ', 'aaaaaaeeeeiiiiooooouuuuncAAAAAAEEEEIIIIOOOOOUUUUUNC' ); END; $$ LANGUAGE plpgsql;
调用函数实现标准化:
SELECT t1.name AS name_with_accents, t2.name AS name_without_accents, fn_remove_accents(t1.name) AS normalized_name_t1, fn_remove_accents(t2.name) AS normalized_name_t2 FROM table_with_accents t1 JOIN table_without_accents t2 ON fn_remove_accents(t1.name) = fn_remove_accents(t2.name);
优缺点
- 优点:代码复用性高,调用简洁,后续需要新增字符映射时,只需修改函数内容即可。
- 缺点:需要有数据库对象创建权限,首次使用需执行函数创建语句。
补充说明
如果需要处理更多特殊字符(比如德语的ß转ss、法语的œ转oe等),只需在TRANSLATE的字符映射串中添加对应的字符对即可。
内容的提问来源于stack exchange,提问作者WilsonS
相关产品推荐
相关产品推荐

