2015-10-26 25 views
-3

最近我有这个问题,当我必须将全名分为4个部分。 Firstname, Middle name/Initial, Lastname and Suffix。我对此很难过。请帮忙。如何将全名分为几个部分

Declare @name varchar(100) 
set @name = 'Michael John T. Mac Tavish, Jr.' 
SELECT @name, substring(@name, 1,charindex(' ',@name)) as firstname, 
     left(ltrim(substring(@name, charindex(' ',@name),len(@name)-charindex(' ',@name)+1)),2) as MiddleName, 
     substring(@name, len(@name)-CHARINDEX(' ', REVERSE(@name))+1, len(@name)) as lastname 
+2

你的问题是什么?它不起作用吗?你期望的结果是什么? – qxg

+0

如何将名字“Michael John”,MiddleInitial分隔为“T.”,将姓氏分为“Mac Tavish”,将后缀分为“Jr.”。上面的代码不能正确分离它 – FrostByte91

回答

0

尝试用以下替换您的SQL代码 -

Declare @name varchar(100) 
set @name = 'Michael John T. Mac Tavish, Jr.' 
SELECT @name as Name, 
     rtrim(ltrim(substring(@name,1,dbo.pos(@name,' ',2)))) as firstname, 
     rtrim(ltrim(substring(@name,dbo.pos(@name,' ',2)+1,charindex('.',@name)-dbo.pos(@name,' ',2)))) as MiddleName, 
     rtrim(ltrim(substring(@name,charindex('.',@name)+1,charindex(',',@name)-charindex('.',@name)-1))) as lastname, 
     rtrim(ltrim(substring(@name,charindex(',',@name)+1,len(@name)))) as Suffix 

功能代码,找出一个字符的第n次出现在字符串 -

CREATE FUNCTION dbo.Pos(@string VARCHAR(MAX),@delim VARCHAR(1),@occur INT) 
RETURNS INT 
AS 
BEGIN 
DECLARE @pos int, @counter int, @ret int 
SET @pos = CHARINDEX(@delim, @string) 
set @counter = 1 
if @occur = 1 set @ret = @pos 
else 
begin 
while (@counter < @occur) 
begin 
select @ret = CHARINDEX(@delim, @string, @pos + 1) 
set @counter = @counter + 1 
set @pos = @ret 
end 
end 
RETURN @ret 
END 

但我真的建议你可以重新设计你的问题并提供更多的信息(你的字符串模式,你如何识别提取名称部分的分隔符等)来更有效地解决问题。

+0

感谢@Abhishek分享你的想法。我应该重新提出我的问题来说清楚。你的解决方案正在工作,但我仍然遇到了一些关于名字的错误,'马克格雷戈里凯文T. Mac Tavish'亚洲名字太长了。马克格雷戈里凯文是我觉得很难分开的第一个名字。 – FrostByte91

+0

什么是错误,在这里发布,如果名称太长,您只能增加数据类型的大小。无论如何,你需要提供更多关于如何分隔FirstName和所有......的细节。 – Abhishek