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

PostgreSQL如何从字符串中提取多个邮箱地址?

在PostgreSQL中提取字符串中的多个邮箱地址

要提取字符串字段里的多个邮箱,你需要用regexp_matches函数配合string_agg来实现——你之前用的substring只能返回第一个匹配项,而regexp_matches支持全局匹配所有符合规则的内容,再通过string_agg把结果拼接成你需要的分号分隔格式。

核心解决方案

假设你的字段名为email_str,表名为your_table,可以用以下SQL:

SELECT 
  string_agg(match[1], ';' ORDER BY match[1]) AS extracted_emails
FROM 
  your_table,
  regexp_matches(email_str, '[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,6}', 'g') AS match
GROUP BY email_str;

代码解释

  • regexp_matches(email_str, '正则表达式', 'g'):g是全局匹配标志,会返回所有符合正则规则的邮箱,每个邮箱以数组形式(match[1]就是匹配到的邮箱字符串)作为单独一行。
  • string_agg(match[1], ';'):把所有匹配到的邮箱用分号连接成一个字符串,ORDER BY match[1]可选,用来对邮箱做排序。

用你的示例数据测试

可以用CTE模拟你的输入数据验证效果:

WITH test_data AS (
  SELECT 'abc-cde-ghi-abc@test.com -cde@test.com' AS email_str
  UNION ALL
  SELECT 'Finance-ddl-sample@yahoo.com-sample1@gmail.com-sample2@msn.com' AS email_str
)
SELECT 
  string_agg(match[1], ';' ORDER BY match[1]) AS extracted_emails
FROM 
  test_data,
  regexp_matches(email_str, '[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,6}', 'g') AS match
GROUP BY email_str;

执行后会得到你期望的输出:

abc@test.com;cde@test.com
sample@yahoo.com;sample1@gmail.com;sample2@msn.com

额外提示

如果你的字段可能包含空值或无效内容,可以添加过滤条件,比如WHERE match[1] IS NOT NULL,不过你的正则已经能匹配标准邮箱格式,一般不需要额外处理。

内容的提问来源于stack exchange,提问作者Ram

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 19:02:45