You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.28 07:15:03