首页 > 解决方案 > 如果字符串是电子邮件格式,我如何从列中提取?

问题描述

我想提取特定列中包含的不同电子邮件。该列可能有其他类型的字符串,这些字符串可能不是我想要排除的电子邮件,而我只想要电子邮件。

Table 1 
ID         Value 
1          Sent Email successfully to John.Muller@gmail.com, Jim.James@gmail.com, Bob.King@hotmail.com and it will be sent tomorrow
2          Email not successful to adam.sandy@yahoo.com, Trisha.stratus@gmail.com, lindy.123@gmail.com  and it will not be sent today

如果我们看到这种格式,我每个 ID 上都有 3 封不同的电子邮件,我想知道是否有任何方法可以获取这种格式的数据。

  Expected output 
ID         Value 
1          John.Muller@gmail.com, Jim.James@gmail.com, Bob.King@hotmail.com  
2          adam.sandy@yahoo.com, Trisha.stratus@gmail.com, lindy.123@gmail.com   

如果这种类型的输出也是可能的,那就太好了。

  Another Possible Output (this would be awesome if possible) 
ID         Value 
1          John.Muller@gmail.com 
1          Jim.James@gmail.com 
1          Bob.King@hotmail.com  
2          adam.sandy@yahoo.com 
2          Trisha.stratus@gmail.com 
2          lindy.123@gmail.com   

标签: sqltsqlsql-server-2014

解决方案


这是一个内联方法

例子

Select A.ID
      ,Value = B.RetVal
 From  YourTable A
 Cross Apply (
                Select RetSeq = Row_Number() over (Order By (Select null))
                      ,RetVal = v.value('(./text())[1]', 'varchar(150)')
                 From  (values (convert(xml,'<x>' + replace(replace(Value,' ',','),',','</x><x>')+'</x>'))) x(n)
                 Cross Apply n.nodes('x') node(v)
              ) B
 Where RetVal like '%@%.___'

退货

ID  Value
1   John.Muller@gmail.com
1   Jim.James@gmail.com
1   Bob.King@hotmail.com
2   adam.sandy@yahoo.com
2   Trisha.stratus@gmail.com
2   lindy.123@gmail.com

编辑作为一行返回

Select A.ID
      ,B.Value 
 From  YourTable A
 Cross Apply (
                Select Value = Stuff((Select ', ' +RetVal 
                  From (
                        Select RetSeq = Row_Number() over (Order By (Select null))
                              ,RetVal = v.value('(./text())[1]', 'varchar(150)')
                         From  (values (convert(xml,'<x>' + replace(replace(Value,' ',','),',','</x><x>')+'</x>'))) x(n)
                         Cross Apply n.nodes('x') node(v)
                       ) B1
                  Where RetVal like '%@%.___'
                  Order by RetSeq
                  For XML Path ('')),1,2,'') 
              ) B

退货

ID  Value
1   John.Muller@gmail.com, Jim.James@gmail.com, Bob.King@hotmail.com
2   adam.sandy@yahoo.com, Trisha.stratus@gmail.com, lindy.123@gmail.com

推荐阅读