2011-05-12 73 views
1

我有一個包含後綴的姓氏字段,我需要將該字段拆分爲姓氏字段和後綴字段。我嘗試過charindex,但我的語法很難。數據的樣本:拆分字段中的姓氏和後綴

Miller 
Wilson Jr 
Hearne Sr 
Horner III 
Bond jr 
Jones-Alexander 
Brown ii 
Rodriguez Maldonado 
Appleby 

我試圖找到在SQL Server中的可靠的select語句將這些數據拉入另一個表的姓氏和後綴分離。

謝謝你的幫助。

編輯附加信息張貼答案

如果沒有後綴,我想獲得 姓爲姓領域, 並保留後綴爲NULL。

幸運的是,有沒有名字 或標題在這一領域,所以我不會 擔心這些,只是 II,III,IV,JR,SR,兩部分的最後 名,

+1

如果沒有後綴,會發生什麼? – Femi 2011-05-12 14:19:59

+0

類似的文章:http://stackoverflow.com/questions/630907/mssql-split-a-field-into-3-fields – garnertb 2011-05-12 14:21:30

+0

名稱本質上是邪惡複雜的,因爲一個人的名字可能存在大約1000種方式。這裏有一個博客http://blogs.lessthandot.com/index.php/DataMgmt/DataDesign/parsing-fullname-field-to-individual – DForck42 2011-05-12 14:27:22

回答

2

您應該能夠使用CASE語句來檢查您在數據中看到的名稱是否存在。

CASE WHEN POSITION(' Jr' IN LastName) > 0 
    THEN SUBSTRING(LastName FROM POSITION(' Jr' IN LastName) FOR 2) 
    WHEN POSITION(' III' IN LastName) > 0 
    .... 
END 

它肯定不會抓住所有東西,你可能需要不斷調整它。您的其他選擇是引入一個數據質量工具,該工具可以使用已知名稱和姓氏以及足夠的名稱和標題名稱來解析名稱數據。不要忘記你可能會遇到John M. Smith III, MD。你將如何處理?

0

謝謝你的幫助。我最終使用了一個Case語句來獲得我需要的東西。這看起來有點粗糙,但看起來像我需要的是可靠的:

CASE 
    WHEN (mytable.L_NAME like '% Jr') Then SUBSTRING(mytable.L_NAME, 1,CHARINDEX(' ', mytable.L_NAME) - 1) 
    WHEN (mytable.L_NAME like '% Sr') Then SUBSTRING(mytable.L_NAME, 1,CHARINDEX(' ', mytable.L_NAME) - 1) 
    WHEN (mytable.L_NAME like '% II') Then SUBSTRING(mytable.L_NAME, 1,CHARINDEX(' ', mytable.L_NAME) - 1) 
    WHEN (mytable.L_NAME like '% III') Then SUBSTRING(mytable.L_NAME, 1,CHARINDEX(' ', mytable.L_NAME) - 1) 
    WHEN (mytable.L_NAME like '% IV') Then SUBSTRING(mytable.L_NAME, 1,CHARINDEX(' ', mytable.L_NAME) - 1) 
    WHEN (mytable.L_NAME like '% V') Then SUBSTRING(mytable.L_NAME, 1,CHARINDEX(' ', mytable.L_NAME) - 1) 
    WHEN (mytable.L_NAME like '% VI') Then SUBSTRING(mytable.L_NAME, 1,CHARINDEX(' ', mytable.L_NAME) - 1) 
    ELSE mytable.L_NAME 
END 
AS LastName, 

CASE 
    WHEN (mytable.L_NAME like '% Jr') Then 'Jr' 
    WHEN (mytable.L_NAME like '% Sr') Then 'Sr' 
    WHEN (mytable.L_NAME like '% II') Then 'II' 
    WHEN (mytable.L_NAME like '% III') Then 'III' 
    WHEN (mytable.L_NAME like '% IV') Then 'IV' 
    WHEN (mytable.L_NAME like '% V') Then 'V' 
    WHEN (mytable.L_NAME like '% VI') Then 'VI' 
    ELSE NULL 
END 
AS Suffix, 
+0

如果在後綴名前面有一個空格,這些將不起作用。例如:「Smith Jones V」匹配「%V」,因此您的代碼會搜索第一個空格並返回「Smith」 - 「Jones」將永遠丟失。如果你搜索的是「V」而不是一個空格,那麼你就更接近了......但是對於「史密斯文森特V」的數據,你仍然會失去「文森特」。相反,使用'SUBSTRING(mytable.L_Name,1,Len(mytable.L_Name)-2)' - 而不是2,使用1以上的後綴長度(2代表V,3代表II和IV和JR,4對於III,等等)。 – 2011-05-12 19:50:34

相關問題