2017-05-25 61 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;