尝试这个
Declare @str varchar(max) = 'this is misc andrew@g.com and a medium text returning John@acme.com'
;With Cte AS(
SELECT
Items = Split.a.value('.', 'VARCHAR(100)')
FROM
(
SELECT
CAST('<X>' + REPLACE(@str, ' ' , '</X><X>') + '</X>' AS XML) AS Splitdata
) X
CROSS APPLY Splitdata.nodes('/X') Split(a) )
SELECT Email = STUFF((
SELECT ';'+ Items
FROM Cte
Where Items
LIKE '[A-Z0-9]%[@][A-Z]%[.][A-Z]%'
FOR XML PATH('')),1,1,'')
结果
电子邮件地址
andrew@g.com;John@acme.com
NB~你可能需要做以下
a)根据您的要求,您需要制作一个 TVF(表值函数)。您可以参考使用 Set base 方法在 Sql Server 中拆分函数的文章
b) Email validation like 子句可以使用,但对于更复杂的要求,您可能需要对其进行增强。
c) 如果需要,您可能必须在应用过滤子句之前清理数据。例如 %John@acme.com 是无效的电子邮件。因此请删除“%”符号,然后应用过滤子句。
但是正如有人提到的那样,最好不要在 Sql Server 端进行太多的字符串拆分/操作,我同意他的观点,所以这里有一个 C# 代码来实现相同的
static void Main(string[] args)
{
string str = "this is misc andrew@g.com and a medium text returning John@acme.com";
var result = GetValidEmails(str).Aggregate((a,b)=>a+";" + b);
Console.WriteLine(result);
Console.ReadKey();
}
private static List<string> GetValidEmails(string input)
{
List<string> lstValidEmails = new List<string>();
string regexPattern = @"^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$";
foreach (string email in input.Split(' '))
{
if (new Regex(regexPattern, RegexOptions.IgnoreCase).IsMatch(email))
{
lstValidEmails.Add(email);
}
}
return lstValidEmails;
}
希望这会有所帮助。