SQL 重新格式化电子邮件地址

SQL to re-format email address

我想将 SQL Select 语句放在一起,将格式 smith_john@test.com 的电子邮件地址重新格式化为 john.smith@test.com。显然名字和姓氏中的字符数将发生变化,但下划线字符 (_) 将标识我要更新的地址。

完成此任务的最佳方法是什么?电子邮件地址字段 (EMAIL_ADD) 当前包含整个电子邮件地址字符串。

我已将它分解成各个部分,这样更容易看清。

declare @email varchar(100) = 'smith_john@test.com'

SELECT SUBSTRING(@email, CHARINDEX('_',@email )+1, CHARINDEX('@',@email )-CHARINDEX('_', @email)-1) --first name
       + '.'
       + LEFT(@email,CHARINDEX('_',@email )-1)  -- last name
       + RIGHT(@email, LEN(@email)- CHARINDEX('@', @email)+1)  --domain

基于@WamLeslie 的回答

CROSS APPLY 在这里有很大帮助,因为您可以多次使用相同的表达式

SELECT
   SUBSTRING(
       email,
       v1.underscore + 1,
       v2.atsign - v1.underscore - 1
   ) --first name
   + '.'
   + LEFT(email, v1.underscore - 1)  -- last name
   + RIGHT(email, LEN(email) - v2.atsign + 1)  --domain
FROM table
CROSS APPLY (VALUES( NULLIF(CHARINDEX('_', email), 0) )) AS v1(underscore)
CROSS APPLY (VALUES( NULLIF(CHARINDEX('@', email, v1.underscore), 0) )) AS v2(atsign)