我正在尝试从电子邮件地址中提取一个名称,该名称将始终为firstname.lastname@domain
我使用以下语句完成了此操作:
replace(left(column, charindex('@', column) - 1), '.', ' '), 1)) AS Requestor
但是,某些电子邮件中的名称是小写的,如果是这样,我还需要大写。 joe bloggs
= Joe Bloggs
创建函数来执行此操作是最好的选择,还是有人可以建议对上述语句进行更新以解决此问题?
答案 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