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
相关产品推荐
相关产品推荐

