在SQL Server中使用分号分隔符拆分电子邮件
我有一列存储多封电子邮件,分号分隔如下:在SQL Server中使用分号分隔符拆分电子邮件,sql,sql-server,string,tsql,split,Sql,Sql Server,String,Tsql,Split,我有一列存储多封电子邮件,分号分隔如下: | Email | | -----------------------------| | abc@y.aa; abc@z.bb | | pqr@y.bb; pqr@x.cc; pqr@z.dd | | xyx@y.dd; xyx@z.pp | 我想用分号分隔电子邮件,并将它们存储在不同的列中 我尝试了一些字符串命令,但它没有提供适当的结果 REVERSE(PARSEN
| Email |
| -----------------------------|
| abc@y.aa; abc@z.bb |
| pqr@y.bb; pqr@x.cc; pqr@z.dd |
| xyx@y.dd; xyx@z.pp |
我想用分号分隔电子邮件,并将它们存储在不同的列中
我尝试了一些字符串命令,但它没有提供适当的结果
REVERSE(PARSENAME(REPLACE(REVERSE(Email), ';', '.'), 1)) AS [Email1],
REVERSE(PARSENAME(REPLACE(REVERSE(Email), ';', '.'), 2)) AS [Email2],
REVERSE(PARSENAME(REPLACE(REVERSE(Email), ';', '.'), 3)) AS [Email3]
任何关于这方面的线索都将不胜感激
如果有更好的解决方案,请在这里分享
提前谢谢 如果您有已知或最大数量的电子邮件地址,可以使用一点JSON 示例
Select A.[email]
,Email1 = JSON_VALUE(S,'$[0]')
,Email2 = JSON_VALUE(S,'$[1]')
,Email3 = JSON_VALUE(S,'$[2]')
From YourTable A
Cross Apply ( values ( '["'+replace(replace(email,' ',''),';','","')+'"]' ) ) B(S)
结果
email Email1 Email2 Email3
abc@y.aa; abc@z.bb abc@y.aa abc@z.bb NULL
pqr@y.bb; pqr@x.cc pqr@y.bb pqr@x.cc NULL
xyx@y.dd; xyx@z.pp xyx@y.dd xyx@z.pp NULL
如果您有已知或最大数量的电子邮件地址,则可以使用一点JSON 示例
Select A.[email]
,Email1 = JSON_VALUE(S,'$[0]')
,Email2 = JSON_VALUE(S,'$[1]')
,Email3 = JSON_VALUE(S,'$[2]')
From YourTable A
Cross Apply ( values ( '["'+replace(replace(email,' ',''),';','","')+'"]' ) ) B(S)
结果
email Email1 Email2 Email3
abc@y.aa; abc@z.bb abc@y.aa abc@z.bb NULL
pqr@y.bb; pqr@x.cc pqr@y.bb pqr@x.cc NULL
xyx@y.dd; xyx@z.pp xyx@y.dd xyx@z.pp NULL
这里有两种方法:
DECLARE@email表(email VARCHAR(1000));
插入@email值('s)abc@y.aa; abc@z.bb'),('pqr@y.bb; pqr@x.cc'),('xyx@y.dd; xyx@z.pp');
--==== 1. 使用APPLY
挑选
EmailGroup=e.电子邮件,
Email=email1.E1
来自@email AS e
交叉应用(值)
(子字符串(e.Email,0,CHARINDEX(“;”,e.Email)),
(子字符串(e.Email,CHARINDEX(“;”,e.Email)+18000))
)作为电子邮件1(E1);
--==== 2. 使用字符串分割
选择e.电子邮件,拆分。[值]
来自@email AS e
交叉应用字符串_SPLIT(例如电子邮件“;”)作为拆分;
两者都返回:
EmailGroup Email
----------------------- -------------
abc@y.aa; abc@z.bb abc@y.aa
abc@y.aa; abc@z.bb abc@z.bb
pqr@y.bb; pqr@x.cc pqr@x.cc
pqr@y.bb; pqr@x.cc pqr@y.bb
xyx@y.dd; xyx@z.pp xyx@y.dd
xyx@y.dd; xyx@z.pp xyx@z.pp
对于同一行上的两封电子邮件:
SELECT
EmailGroup = e.Email,
Email1 = SUBSTRING(e.Email,0,CHARINDEX(';',e.email)),
Email2 = SUBSTRING(e.Email,CHARINDEX(';',e.email)+1,8000)
FROM @email AS e;
EmailGroup Email1 Email2
---------------------- ---------- ---------------
abc@y.aa; abc@z.bb abc@y.aa abc@z.bb
pqr@y.bb; pqr@x.cc pqr@y.bb pqr@x.cc
xyx@y.dd; xyx@z.pp xyx@y.dd xyx@z.pp
这里有两种方法:
DECLARE@email表(email VARCHAR(1000));
插入@email值('s)abc@y.aa; abc@z.bb'),('pqr@y.bb; pqr@x.cc'),('xyx@y.dd; xyx@z.pp');
--==== 1. 使用APPLY
挑选
EmailGroup=e.电子邮件,
Email=email1.E1
来自@email AS e
交叉应用(值)
(子字符串(e.Email,0,CHARINDEX(“;”,e.Email)),
(子字符串(e.Email,CHARINDEX(“;”,e.Email)+18000))
)作为电子邮件1(E1);
--==== 2. 使用字符串分割
选择e.电子邮件,拆分。[值]
来自@email AS e
交叉应用字符串_SPLIT(例如电子邮件“;”)作为拆分;
两者都返回:
EmailGroup Email
----------------------- -------------
abc@y.aa; abc@z.bb abc@y.aa
abc@y.aa; abc@z.bb abc@z.bb
pqr@y.bb; pqr@x.cc pqr@x.cc
pqr@y.bb; pqr@x.cc pqr@y.bb
xyx@y.dd; xyx@z.pp xyx@y.dd
xyx@y.dd; xyx@z.pp xyx@z.pp
对于同一行上的两封电子邮件:
SELECT
EmailGroup = e.Email,
Email1 = SUBSTRING(e.Email,0,CHARINDEX(';',e.email)),
Email2 = SUBSTRING(e.Email,CHARINDEX(';',e.email)+1,8000)
FROM @email AS e;
EmailGroup Email1 Email2
---------------------- ---------- ---------------
abc@y.aa; abc@z.bb abc@y.aa abc@z.bb
pqr@y.bb; pqr@x.cc pqr@y.bb pqr@x.cc
xyx@y.dd; xyx@z.pp xyx@y.dd xyx@z.pp
试试这个:
Declare @testTable Table (Email varchar(100));
Insert Into @testTable (Email)
Values ('abc@a.aa')
, ('abc@y.aa; abc@z.bb')
, ('pqr@y.bb; pqr@x.cc; pqr@z.dd')
, ('xyx@y.dd; xyx@z.pp');
Select tt.Email
, email1 = ltrim(substring(v.email, 1, p01.pos - 2))
, email2 = ltrim(substring(v.email, p01.pos, p02.pos - p01.pos - 1))
, email3 = ltrim(substring(v.email, p02.pos, p03.pos - p02.pos - 1))
From @testTable As tt
Cross Apply (Values (concat(tt.Email, replicate(';', 3)))) As v(email)
Cross Apply (Values (charindex(';', v.email, 1) + 1)) As p01(pos)
Cross Apply (Values (charindex(';', v.email, p01.pos) + 1)) As p02(pos)
Cross Apply (Values (charindex(';', v.email, p02.pos) + 1)) As p03(pos)
试试这个:
Declare @testTable Table (Email varchar(100));
Insert Into @testTable (Email)
Values ('abc@a.aa')
, ('abc@y.aa; abc@z.bb')
, ('pqr@y.bb; pqr@x.cc; pqr@z.dd')
, ('xyx@y.dd; xyx@z.pp');
Select tt.Email
, email1 = ltrim(substring(v.email, 1, p01.pos - 2))
, email2 = ltrim(substring(v.email, p01.pos, p02.pos - p01.pos - 1))
, email3 = ltrim(substring(v.email, p02.pos, p03.pos - p02.pos - 1))
From @testTable As tt
Cross Apply (Values (concat(tt.Email, replicate(';', 3)))) As v(email)
Cross Apply (Values (charindex(';', v.email, 1) + 1)) As p01(pos)
Cross Apply (Values (charindex(';', v.email, p01.pos) + 1)) As p02(pos)
Cross Apply (Values (charindex(';', v.email, p02.pos) + 1)) As p03(pos)
请提供样本数据和预期结果。此外,是否有大量电子邮件?根据SQL的版本,有一个字符串解析函数可以将数据解析到表中,您可以从表结果中选择它,但正如Linoff提到的,请提供数据和结果是的,我刚刚添加了它的SQL服务器2016@cool_taps然后更改损坏的功能。它从一开始就坏了,所以迟早要修好。你现在拥有的东西根本无法被查询或索引。如果您不想查询电子邮件值,您可以在客户端进行拆分,并将字段视为黑框。请提供示例数据和所需结果。此外,是否有大量电子邮件?根据SQL的版本,有一个字符串解析函数可以将数据解析到表中,您可以从表结果中选择它,但正如Linoff提到的,请提供数据和结果是的,我刚刚添加了它的SQL服务器2016@cool_taps然后更改损坏的功能。它从一开始就坏了,所以迟早要修好。你现在拥有的东西根本无法被查询或索引。如果您不想查询电子邮件值,您可以在客户端进行拆分,并将该字段视为一个黑框。谢谢,但给出了一个错误-JSON文本格式不正确。在位置1处发现意外字符“”。@cool_taps不清楚您遇到的错误。请看一看@cool_taps,请不要错过我关于最小可复制示例的评论。谢谢,但给出了一个错误-JSON文本格式不正确。意外字符“”'在位置1处找到。@cool\u不清楚您得到的错误。看一眼“酷”水龙头,请不要错过我关于最小可复制示例的评论。@Alan Burstein-谢谢!第二个版本正在运行。我收到了两封正确的电子邮件。在某些情况下,它有3封电子邮件,那么我应该做哪些更改才能收到电子邮件3?谢谢@Charlieface我将更新第一个解决方案shortly@Alan伯斯坦-谢谢!第二个版本正在运行。我收到了两封正确的电子邮件。在某些情况下,它有3封电子邮件,那么我应该做哪些更改才能收到电子邮件3?谢谢@Charlieface我将很快更新第一个解决方案