BigQuery中UPPER函数保留特殊字符转大写的实现方法
保留特殊字符的大写转换方案
默认的UPPER()(或对应语言的toUpperCase()/upper())函数会遵循Unicode标准的大小写等价规则,导致部分特殊字符被转换(比如ß转为SS)。要实现转大写同时保留特殊字符,核心是只对普通小写字母进行转换,其他字符原样保留,以下是几种常用场景的实现方式:
MySQL 实现
自定义函数方案
创建一个自定义函数,遍历字符串仅转换ASCII小写字母:
DELIMITER // CREATE FUNCTION UPPER_PRESERVE_SPECIAL(str VARCHAR(255)) RETURNS VARCHAR(255) DETERMINISTIC BEGIN DECLARE i INT DEFAULT 1; DECLARE len INT DEFAULT LENGTH(str); DECLARE res VARCHAR(255) DEFAULT ''; DECLARE c CHAR(1); WHILE i <= len DO SET c = SUBSTRING(str, i, 1); IF c REGEXP '[a-z]' THEN SET res = CONCAT(res, UPPER(c)); ELSE SET res = CONCAT(res, c); END IF; SET i = i + 1; END WHILE; RETURN res; END // DELIMITER ;
调用示例:
SELECT UPPER_PRESERVE_SPECIAL('Straße KAISTRAßE HØJBRO plads'); -- 输出:STRAßE KAISTRAßE HØJBRO PLADS
Python 实现
遍历字符方案
def upper_preserve_special(s): result = [] for char in s: if 'a' <= char <= 'z': result.append(char.upper()) else: result.append(char) return ''.join(result) # 测试 print(upper_preserve_special('GothaER Straße HØJBRO plads QUAI À LA Chaux')) # 输出:GOTHAER STRAßE HØJBRO PLADS QUAI À LA CHAUX
正则替换方案
import re def upper_preserve_special(s): return re.sub(r'[a-z]', lambda match: match.group().upper(), s)
JavaScript 实现
function upperPreserveSpecial(str) { let result = ''; for (const char of str) { if (char >= 'a' && char <= 'z') { result += char.toUpperCase(); } else { result += char; } } return result; } // 测试 console.log(upperPreserveSpecial('Straße QUAI À LA Chaux')); // 输出:STRAßE QUAI À LA CHAUX
说明
上述方案的核心逻辑是仅对a-z范围内的ASCII小写字母执行转大写操作,其余字符(包括带重音的字母、特殊符号如ß、Ø、À等)直接保留原样,避免了Unicode标准转换带来的特殊字符替换问题。
内容的提问来源于stack exchange,提问作者Prashant Joshi
相关产品推荐
相关产品推荐

