2017-05-25 135 views
-1

我想将名称字段分隔到适当的字段中。名称字段不一致。它可以显示为李四III,约翰·w^DOE,约翰,李四III,约翰,李四,约翰·w^或者它可能缺乏的后缀,或中间名首字母。任何想法将不胜感激。解析SQL中的名称字段

SELECT (
     CASE LEN(REPLACE(FirstName, ' ', '')) 
      WHEN LEN(FirstName + ' ') - 1 
       THEN PARSENAME(REPLACE(FirstName, ' ', '.'), 2) 
      ELSE PARSENAME(REPLACE(FirstName, ' ', '.'), 3) 
      END 
     ) AS LastName 
    ,(
     CASE LEN(REPLACE(FirstName, ' ', '')) 
      WHEN LEN(FirstName + ',') - 1 
       THEN NULL 
      ELSE PARSENAME(REPLACE(FirstName, ' ', '.'), 2) 
      END 
     ) AS Suffix 
    ,PARSENAME(REPLACE(FirstName, ' ', '.'), 1) AS FirstName 
FROM Trusts.dbo.tblMember 

我所需要的名字无论何种格式,如上所述,为了解析成名字,后缀,姓,MiddleInitial,的相应的字段而不管其是否具有一个后缀或一个中间初始

+4

请参阅[如何提出一个很好的SQL问题(https://meta.stackoverflow.com/a/271056/5234334),并提及你的数据库,预期的结果,样本数据 – Utsav

+0

我曾尝试以下内容: \t(LEN(REPLACE(FirstName,'',''))LEN(FirstName +'') - 1 then PARSENAME(REPLACE(FirstName,'','。'),2) (LEN(REPLACE(FirstName,'','')),当LEN(FirstName +',') - 1时,返回PARSENAME(REPLACE(FirstName,'','。'),3)end)作为LastName, \t然后null否则PARSENAME(REPLACE(FirstName,'','。'),2)end)作为后缀, \t PARSENAME(替换(名字,'','。'),1)作为名字 来自Trusts.dbo.tblMember – Marshall

+0

然后问题是非常含糊不清样本数据,它处理所有的情况和您的预期输出基于此。使用rextester.com创建表并在SQL服务器中插入示例行,并根据这些信息告诉我们您的预期输出。 – Utsav

回答

0

如果给定的4个名称是唯一类型的案例,那么您可以使用类似下面的内容。

注意:为了更好地理解主查询,我使用了CTE表tbl2来区分comma_pos,first_space,second_space。您可以将主查询中的这些值与它们在CTE中的相应函数进行替换,以使主查询更快。我的意思是用charindex(',',name)等替换主查询中的comma_pos

此外,我假设name列中没有前导/尾随或额外的空格或任何垃圾字符。如果有,请在继续之前先清理数据。

Rexter Sample

with tbl2 as (
select tbl.*, 
    charindex(',',name) as comma_pos, 
    charindex(' ',name,1) first_space, 
    charindex(' ',name,charindex(' ',name,1)+1) second_space 
from tbl) 

select tbl2.name 

,case when second_space <> 0 
     then substring(name,comma_pos+1,second_space-comma_pos-1) 
     when first_space > comma_pos 
     then substring(name,comma_pos+1,first_space-comma_pos-1) 
     else substring(name,comma_pos+1,len(name)-comma_pos) 
end as first_name 

,case when second_space <> 0 
     then substring(name,second_space+1,len(name)-second_space) 
     when first_space > comma_pos 
     then substring(name,first_space+1,len(name)-first_space) 
     end as middle_name 
,case when first_space=0 or first_space>comma_pos 
    then substring(name,1,comma_pos-1) 
    else substring(name,1,first_space-1) 
end as last_name 
,case when first_space=0 or first_space>comma_pos 
    then null 
    else substring(name,first_space,comma_pos-first_space) 
end as suffix 

from tbl2;