2015-04-01 314 views
0

我有一列爲FullName,其中包含FirstName,MiddleName, LastName
例如:SQL-獲取第一個空格後的子字符串和第二個空格分隔列

FullName: Marilyn Kean Kirkland

我想從中取一個字串有FirstName,從FullNameMiddleNameLastName 3個獨立的列。

我使用的代碼拉動FirstName

substring(c.LegalName, 1, CHARINDEX(' ', c.LegalName)) as 'First Name' 

我想知道我怎麼能拉只是其中說到後第一空間和之前第二空間的中間名?
另外,我想拉第二個空格後的姓氏?

+1

這是一個壞主意。並非每個全名都有兩個空格,並且所有名字都不是全部由第一個,中間和最後一個名字組成。 (不是每個人都有一箇中間名(甚至是姓氏);很多人有多個首字母/中間名/姓;第一個/中間/姓可以包含內部空格;額外的後綴可以跟在姓氏後面等等。等等)見http://www.w3.org/International/questions/qa-personal-names。 – ruakh 2015-04-01 19:41:54

+0

['CHARINDEX'](https://msdn.microsoft.com/en-us/library/ms186323(v = sql.100).aspx)有第三個參數。用它。 – GSerg 2015-04-01 19:44:08

+0

@ruakh我知道這是一個壞主意,但這是我們的客戶想要的數據看起來像。你知道我怎麼能拉第一個空格之後和第二個空格之前的中間名,並拉第二個空格之後的姓?如果沒有中間名或最後一個名字,則應將其保留爲空白。您的幫助將不勝感激。 – 2015-04-01 20:40:25

回答

1

SQL Server沒有很好的字符串操作函數。子查詢更容易:

select firstname, 
     stuff(reverse(stuff(reverse(legalname), 1, len(lastname) + 1, '')), 
      1, len(firstname) + 1, '') 
from (select legalname, 
      left(legalname, charindex(' ', legalname) - 1) as firstname, 
      right(legalname, charindex(' ', reverse(legalname)) - 1) as lastname 
     . . . 
    ) c 

但是,我會非常小心,因爲並非所有人都有三個部分名稱。其他人有後綴(JR,SR)和其他併發症。

+0

此查詢不起作用,它會引發錯誤:Msg 174,Level 15,State 1,Line 2 反向函數需要1個參數。 Msg 102,Level 15,State 1,Line 9 'c'附近語法不正確。 – 2015-04-01 20:37:54

+0

用'FROM 替換... ...。 – ughai 2015-04-02 05:35:29

0

你可以嘗試這樣的事情。

;WITH c AS 
(
    SELECT 'Marilyn Kean Kirkland' AS legalname 
    UNION ALL SELECT 'J Smith' AS legalname 
) 
SELECT 
    SUBSTRING(legalname,1,space1) firstname, 
    SUBSTRING(legalname,space1,space2 - space1 + 1) middlename, 
    SUBSTRING(legalname,space2 + 1,totallength - space2) lastname 
FROM 
(
    SELECT 
     legalname, 
     CHARINDEX(' ',legalname) space1, 
     LEN(legalname) - CHARINDEX(' ',REVERSE(legalname)) space2, 
     LEN(legalname) as totallength 
    FROM c 
)c 
GO 

如由其他用戶如上所述以及,這些腳本將與用戶僅具有3一部分或2部件名稱的工作。

相關問題