Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.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_String_Tsql_Split - Fatal编程技术网

在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我将很快更新第一个解决方案