PostgreSQL中如何实现邮箱用户名首字母大写 解决initcap多余大写问题
PostgreSQL 提取邮箱用户名并实现指定大小写格式的方案
问题根因
PostgreSQL内置initcap函数的转换逻辑是:将所有非字母数字字符识别为单词分隔符,自动把每个分隔符后的首字母转为大写、其余字母转为小写。因此当用户名中包含.时,点号后的首字母会被自动大写,无法满足「仅整个字符串首个字符大写、其余字符全部小写」的要求。
实现逻辑
整个实现分两步完成:
- 提取@符号前的用户名片段:使用
split_part函数按@分割邮箱字符串,取第1段即可,语法为split_part(邮箱值, '@', 1)。对示例值MARIE.SUE@example.com执行该步骤会返回MARIE.SUE。 - 自定义大小写转换:不使用
initcap,拆分字符串拼接实现目标格式:- 取用户名的第一个字符,用
upper()转为大写 - 取用户名从第二位开始的剩余所有内容,用
lower()统一转为小写 - 拼接两部分内容得到最终结果
- 取用户名的第一个字符,用
代码示例
单值测试
SELECT upper(left(split_part('MARIE.SUE@example.com', '@', 1), 1)) || lower(right(split_part('MARIE.SUE@example.com', '@', 1), length(split_part('MARIE.SUE@example.com', '@', 1)) - 1)) AS formatted_name;
执行上述语句返回结果为Marie.sue,完全符合预期。
表数据批量处理
假设存储用户信息的表为users,邮箱字段为email,批量处理的写法如下:
SELECT -- 可按需添加其他查询字段 upper(left(split_part(email, '@', 1), 1)) || lower(right(split_part(email, '@', 1), length(split_part(email, '@', 1)) - 1)) AS formatted_username FROM users;
边界说明
该写法自动兼容单字符用户名场景:例如邮箱为Z@test.com时,剩余截取长度为0,right函数会返回空字符串,最终输出Z,不会抛出语法错误。
内容的提问来源于stack exchange,提问作者Zero
相关产品推荐
相关产品推荐

