MySQL中传入用户名提取对应邮箱域名的实现方法
解决MySQL中根据用户名提取邮箱域名的需求
这个需求用MySQL自带的字符串处理函数就能轻松实现,核心思路是利用SUBSTRING_INDEX函数拆分邮箱字符串,匹配用户名并提取目标域名部分。
核心逻辑拆解
邮箱格式为用户名@域名.后缀,我们需要两步操作:
- 匹配目标用户:从
mails字段中提取@左侧的用户名,和传入参数做匹配,筛选出对应记录。 - 提取域名主体:从匹配到的邮箱中,先提取
@右侧的部分(比如gmail.com),再提取这部分中第一个.左侧的内容(也就是gmail)。
直接查询实现
针对你的两个测试案例,直接写SQL查询就能得到结果:
案例1:传入harishsng
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(mails, '@', -1), '.', 1) AS domain FROM mails WHERE SUBSTRING_INDEX(mails, '@', 1) = 'harishsng';
执行后返回gmail,符合预期。
案例2:传入harish.sn
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(mails, '@', -1), '.', 1) AS domain FROM mails WHERE SUBSTRING_INDEX(mails, '@', 1) = 'harish.sn';
执行后返回m-tutor,完全满足需求。
封装成存储过程(可选)
如果需要频繁调用,可以把逻辑封装成存储过程,传入用户名更便捷:
DELIMITER // CREATE PROCEDURE GetEmailDomain(IN username VARCHAR(45)) BEGIN SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(mails, '@', -1), '.', 1) AS domain FROM mails WHERE SUBSTRING_INDEX(mails, '@', 1) = username; END // DELIMITER ;
调用方式:
CALL GetEmailDomain('harishsng'); -- 返回gmail CALL GetEmailDomain('harish.sn'); -- 返回m-tutor
函数说明
这里用到的SUBSTRING_INDEX是MySQL实用的字符串拆分函数:
SUBSTRING_INDEX(str, delim, count):根据分隔符delim拆分字符串str,count为正数时取第count个分隔符左侧内容;为负数时取右侧内容。SUBSTRING_INDEX(mails, '@', 1):提取@左侧的用户名部分SUBSTRING_INDEX(mails, '@', -1):提取@右侧的域名+后缀部分- 嵌套调用
SUBSTRING_INDEX(..., '.', 1):从域名+后缀中提取第一个.左侧的域名主体
这个方案适用于标准格式的邮箱,针对你提供的测试数据完全没问题;如果遇到异常格式的邮箱(比如无@或无.),可以额外添加判断逻辑兼容。
内容的提问来源于stack exchange,提问作者harish_sng
相关产品推荐
相关产品推荐

