Sql 从多个分隔符中获取1个电子邮件地址
我有一封带有多个分隔符的电子邮件,如空格、/ 电子邮件 我的问题是:Sql 从多个分隔符中获取1个电子邮件地址,sql,sql-server,Sql,Sql Server,我有一封带有多个分隔符的电子邮件,如空格、/ 电子邮件 我的问题是: select email, CASE WHEN CHARINDEX(' ', email) > 0 THEN SUBSTRING(email, 0, CHARINDEX(' ', email)) ELSE email END as Emailnew FROM table 我的输出: /john@thundergroup.com.mi/chris@cup.com.ey r.Info@bc.com Dal@pema.co
select email,
CASE WHEN CHARINDEX(' ', email) > 0 THEN SUBSTRING(email, 0, CHARINDEX(' ', email)) ELSE
email END as Emailnew
FROM table
我的输出:
/john@thundergroup.com.mi/chris@cup.com.ey
r.Info@bc.com
Dal@pema.com/Al@ama.com
/randi@mv.com
zul@sd.com/sat@sd.com/ faze@sd.com
请建议更改,以便在单个查询中提取电子邮件要始终获取第一封电子邮件,您可以尝试以下逻辑- 输出将是-
john@thundergroup.com.mi
r.Info@bc.com
Dal@pema.com
randi@mv.com
zul@sd.com
在现代SQL Server上,请尝试以下操作: -设置。。。 创建表dbo.Foo FooID int非空标识主键, 电子邮件nvarchar100 ; 插入dbo.Foo电子邮件值 '/john@thundergroup.com.mi/chris@cup.com.ey', r。Info@bc.com/鲁迪。an@yy.com', 'Dal@pema.com/Al@ama.com', '/randi@mv.com', 'zul@sd.com/sat@sd.com/ faze@sd.com'; 去 -演示。。。 选择FooID,[Email]=value 来自dbo.Foo 外敷 选择前1个值 从字符串_splittranslateEmail,“/”,“;”,“;” 其中nullifvalue不为null 斯普利兹维尔; 这将产生:
FooID Email
1 john@thundergroup.com.mi
2 r.Info@bc.com
3 Dal@pema.com
4 randi@mv.com
5 zul@sd.com
要求:
SQL Server 2016及更高版本。
SQL Server 2017及更高版本。
如果您只想要第一封电子邮件,请使用patindex: 模式a-zA-Z0-9@. 是有效的电子邮件字符。你可能还有其他你关心的问题 不幸的是,我注意到有些列表以分隔符开头。在我看来,通过返回一个空值,上面的操作是正确的。也就是说,在这种情况下,您希望得到的结果是获得第二个值 因此,您必须从第一个有效的电子邮件字符开始搜索:
select t.email,
left(v.email1, patindex('%[^-_a-zA-Z0-9@.]%', v.email1 + ' ') - 1) as Emailnew
from t cross apply
(values (stuff(t.email, 1, patindex('%[-_a-zA-Z0-9@.]%', t.email) - 1, ''))) v(email1);
是一个dbfiddle。您的SQL Server版本是什么?为什么有些行以/开头,而有些行不以/开头?这是否表示第一个电子邮件地址为空?“/”注意两边的空白是否表示有3个空白电子邮件地址?你说。也可以是分隔符。在电子邮件地址中使用,那么您如何区分。是一个分隔符还是电子邮件地址的一部分?我只是删除了我的答案,因为这些细节,尤其是电子邮件地址。作为分隔符@Larnu,因为我没有仔细阅读Q。谢谢指点
FooID Email
1 john@thundergroup.com.mi
2 r.Info@bc.com
3 Dal@pema.com
4 randi@mv.com
5 zul@sd.com
select email,
left(email, patindex('%[^a-zA-Z0-9@.]%', email + ' ') - 1) as Emailnew
from table;
select t.email,
left(v.email1, patindex('%[^-_a-zA-Z0-9@.]%', v.email1 + ' ') - 1) as Emailnew
from t cross apply
(values (stuff(t.email, 1, patindex('%[-_a-zA-Z0-9@.]%', t.email) - 1, ''))) v(email1);