Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 从多个分隔符中获取1个电子邮件地址_Sql_Sql Server - Fatal编程技术网

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);