Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.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 Server中将电子邮件列拆分为三列_Sql_Sql Server - Fatal编程技术网

在Sql Server中将电子邮件列拆分为三列

在Sql Server中将电子邮件列拆分为三列,sql,sql-server,Sql,Sql Server,我在employee表中有一个电子邮件列值: Email regan.manning@cresa.com miang.luso@praxis.com selin.robert@cummins.com 我想将电子邮件分成三列,如: FirstName LastName DomainName -------------------------------------------------- regan manning

我在employee表中有一个电子邮件列值:

Email
regan.manning@cresa.com
miang.luso@praxis.com
selin.robert@cummins.com
我想将电子邮件分成三列,如:

FirstName        LastName              DomainName
--------------------------------------------------
regan            manning               @cresa.com
miang            luso                  @praxis.com
selin            robert                @cummins.com 

一种方法使用
apply

select t.*, v.domain, v2.firstname, v2.lastname
from t cross apply
     (values(stuff(email, 1, charindex('@', email), '') as domain,
             left(email, charindex('@', email)
            )
     ) v(domain, name) cross apply
     (values (left(name, charindex('.')),
              stuff(name, 1, charindex('.', name), '')
             )
     ) v2(lastname, firstname;
--将@email替换为电子邮件列的名称

更容易理解的版本:

DECLARE @email NVARCHAR(30) = 'selin.robert@cummins.com';
DECLARE @dot INT =CHARINDEX( '.' , @email );
DECLARE @atrate INT =CHARINDEX( '@' , @email );
DECLARE @len INT =LEN( @email );

SELECT 
substring( @email , 0 , @dot ),
substring( @email , @dot+1 , @atrate - @dot-1 ),
substring( @email, @atrate , @len - @atrate+1 );

使用
Substring
&
Charindex
功能检查
@
&检索数据:

SELECT @email [Email],
       SUBSTRING(@email, 1, CHARINDEX('.', @email)-1) [FirstName],
       SUBSTRING(@email, CHARINDEX('.', @email)+1, CHARINDEX('@', @email)-CHARINDEX('.', @email)-1) [LastName],
       SUBSTRING(@email, CHARINDEX('@', @email), LEN(@email)) [DomainName] from <table_name>; 

丑陋的问题。那么像jon.m这样的边缘案例呢。skeet@google.co.uk?什么SQL Server版本?如果电子邮件以lastname而不是firstname开头怎么办?如果是员工表,除了email列之外,它没有firstname和lastname列吗?没有,它只有email列,我必须将一列拆分为三列,并将其与派生的firstname和lastname的其他表进行比较…我希望使用substring和charindex。。。你能帮我更新一下查询吗。。。
SELECT @email [Email],
       SUBSTRING(@email, 1, CHARINDEX('.', @email)-1) [FirstName],
       SUBSTRING(@email, CHARINDEX('.', @email)+1, CHARINDEX('@', @email)-CHARINDEX('.', @email)-1) [LastName],
       SUBSTRING(@email, CHARINDEX('@', @email), LEN(@email)) [DomainName] from <table_name>; 
Email                   FirstName    LastName   DomainName
miang.luso@praxis.com   miang        luso       @praxis.com