如何从电子邮件地址中大写名字和姓氏的首字母?

时间:2019-04-25 14:18:04

标签: sql sql-server-2012

我正在尝试从电子邮件地址中提取一个名称,该名称将始终为firstname.lastname@domain

格式

我使用以下语句完成了此操作:

replace(left(column, charindex('@', column) - 1), '.', ' '), 1)) AS Requestor

但是,某些电子邮件中的名称是小写的,如果是这样,我还需要大写。 joe bloggs = Joe Bloggs

创建函数来执行此操作是最好的选择,还是有人可以建议对上述语句进行更新以解决此问题?

5 个答案:

答案 0 :(得分:1)

要回答您的问题,这是相当基本的字符串操作,正如您将从下面的代码的冗长性中看到的那样,它不是SQL Server的强项:

declare @e table (e varchar(100));
insert into @e values('tom.mcdonald@email.com'),('dan.oneill@email.com')

select e.e
      ,upper(left(f,1)) + substring(f,2,999) + ' ' + upper(left(s,1)) + substring(s,2,999) as n
from @e as e
    cross apply(values(substring(e.e,1,charindex('.',e.e)-1)
                      ,substring(e.e,charindex('.',e.e)+1,charindex('@',e.e,1)-charindex('.',e.e)-1)
                      )
               ) as n(f,s);

输出

+------------------------+--------------+
|           e            |      n       |
+------------------------+--------------+
| tom.mcdonald@email.com | Tom Mcdonald |
| dan.oneill@email.com   | Dan Oneill   |
+------------------------+--------------+

答案 1 :(得分:0)

您可以使用upper()将整个字符串大写:

upper(replace(left(column, charindex('@', column) - 1), '.', ' '), 1)))

您可以使用stuff()大写第一个字符:

stuff(replace(left(column, charindex('@', column) - 1), '.', ' '),
      1, 1, upper(left(column, 1))
     )

答案 2 :(得分:0)

我会做的:

select upper(left(fname, 1)) + right(fname, len(fname) - 1) + ' ' + upper(left(lname, 1)) + right(lname, len(lname) - 1) as Requestor
from table t cross apply
     ( values ( left(col, charindex('@', col) - 1) ) 
     ) t(nm) cross apply
     ( values ( left(nm, charindex('.', nm)-1), right(nm, charindex('.', reverse(nm))-1) ) 
     )  t1(fname, lname);

答案 3 :(得分:0)

如果您在提取名称和大写首字母的过程中遇到麻烦,那么我不会将它们混在一起。相反,我将它们保留为两列,因此您进行的任何进一步操作都不需要更多拆分。

您可以利用PARSENAME函数来利用( abuse )来基于.拆分字符串,因此您可以使用以下命令:

-- CAPITALISE FIRST LETTER WITH STUFF AND UPPER
SELECT  Forename = STUFF(t2.Forename, 1, 1, UPPER(LEFT(t2.Forename, 1))),
        Surname = STUFF(t2.Surname, 1, 1, UPPER(LEFT(t2.Surname, 1)))
FROM    (VALUES ('joe.blogs@domain.com')) x ([Column])
-- EXTRACT CHARACTERS TO THE LEFT OF THE @ SIGN
CROSS APPLY (SELECT LEFT([Column], CHARINDEX('@', [Column]) - 1)) AS t1 (FullName)
-- EXTRACT FIRST AND LAST NAME USING PARSENAME
CROSS APPLY (SELECT PARSENAME(FullName, 2), PARSENAME(FullName, 1)) AS t2 (Forename, Surname)

答案 4 :(得分:0)

尝试一下:

declare @t table (email varchar(50))

insert into @t values ('xyz.xyz@gmail.com')

select upper(SUBSTRING(email,1,1)) + SUBSTRING(email,2,CHARINDEX('.',email)-1)+upper(SUBSTRING(email,CHARINDEX('.',email)+1,1)) + SUBSTRING(email,CHARINDEX('.',email)+2,len(email))   from @t