【问题标题】:SQL to re-format email addressSQL 重新格式化电子邮件地址
【发布时间】:2021-04-15 13:42:11
【问题描述】:

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

我能做到这一点的最佳方法是什么?电子邮件地址字段 (EMAIL_ADD) 当前包含整个电子邮件地址字符串。

【问题讨论】:

标签: sql sql-server-2014


【解决方案1】:

以@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)

【讨论】:

  • CTE 也可用于通过新名称重用表达式。我就是这样做的。我不知道这是否有任何区别,只是作为另一种选择提及!
  • 是的,您可以使用 CTE,但我发现它更麻烦,因为您必须不断重新声明列,CROSS APPLY 保持相同的范围
  • 在上面你有一个名为 v2.underscorev1.atsign 的字段,这些不是我拥有的实际字段,所以我只需将这些硬编码值填充为 '_' 和 @ 987654327@?
  • CROSS APPLY 使这些计算作为SELECT 中的字段可用,并在以后的联接和应用中使用
  • 我想我知道发生了什么,但是第二个CROSS APPLY 语句中是否应该有一个下划线'_',而不是再次使用@ 符号?
【解决方案2】:

我已将其分解为各个组件,以便于查看。

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

【讨论】:

  • 很高兴我能帮上忙。
  • 一个问题 - 如果我尝试在我的桌子上运行这个全开,我收到错误“传递给 LEFT 或 SUBSTRING 函数的长度参数无效。”有什么想法要更新吗?并非我所有的电子邮件地址都带有下划线。只有一些人这样做。
  • 不知道数据中有什么,我不能说。此查询依赖于每个值中有一个“_”和一个“@”字符。如果其中任何一个不存在或有多个,您可能会收到此错误。您必须对数据进行一些调查并添加适当的错误检查。
  • 我将它包裹在 CASE 语句中,这似乎有效:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-09
  • 1970-01-01
  • 2017-02-01
  • 2018-09-07
相关资源
最近更新 更多