如何使用SELECT语句查询持有邮箱的用户并提取@前用户名部分
带邮箱用户筛选及@前缀截取的SQL实现
实现逻辑拆解
整个查询需要完成两个核心动作:
- 先把没有有效邮箱的用户全部过滤掉,避免把空值、格式异常的数据查出来
- 对保留的邮箱值,从字符串开头截取到第一个@符号之前的片段,比如
abc@gmail.com最终取到的结果就是abc
通用标准SQL写法
兼容MySQL、PostgreSQL、Oracle等所有支持SQL标准的数据库的基础查询:
SELECT -- 从开头截取到@位置的前一位,就是我们要的邮箱前缀 SUBSTRING(email FROM 1 FOR POSITION('@' IN email) - 1) AS email_prefix FROM users WHERE -- 过滤完全没有填邮箱的记录 email IS NOT NULL AND email != '' -- 过滤没有@的异常格式邮箱,防止截取逻辑因为找不到@触发报错 AND email LIKE '%@%';
各数据库的简化优化写法
不同数据库都提供了更简洁的内置函数,可以直接实现截取需求,不需要手动计算@的位置:
- MySQL 环境:直接用
SUBSTRING_INDEX按分隔符截取目标片段SELECT SUBSTRING_INDEX(email, '@', 1) AS email_prefix FROM users WHERE email IS NOT NULL AND email LIKE '%@%'; - PostgreSQL 环境:用
split_part按分隔符拆分后取第一部分SELECT split_part(email, '@', 1) AS email_prefix FROM users WHERE email IS NOT NULL AND email LIKE '%@%'; - SQL Server 环境:用
LEFT配合CHARINDEX定位@位置后截取SELECT LEFT(email, CHARINDEX('@', email) - 1) AS email_prefix FROM users WHERE email IS NOT NULL AND email LIKE '%@%';
小提示:一定要在WHERE条件里加上
email LIKE '%@%'的判断,否则如果表里存在填了邮箱但根本没写@的脏数据,会因为定位@的位置为0导致整个查询运行报错。
内容的提问来源于stack exchange,提问作者Sangamesh_Varma
相关产品推荐
相关产品推荐

