2010-12-10 61 views
1

我叫全名,我想拆分該名稱作爲名字和姓氏在數據庫中的列:T-SQL查詢問題

下面是一個例子:

全名 彼得·山姆

我希望這是

FirstName LastName 
-------------------- 
Sam   Peter 

但問題是一些數據庫列具有完全的名字,像這樣

FullName 
-------- 
Sam George Jack Peter 
Sam Adam Peter 

我想這是

FirstName   LastName 
---------   -------- 
Sam George Jack  Peter 
Sam Adam   Peter 

我如何寫T-SQL查詢這一點。

在此先感謝所有幫助

回答

2

有一個在this answer描述的非常透徹解析名稱常規。它可以處理你的情況,以及諸如「Martin J Van Buren III先生」等更棘手的案例。

0

字符串操作在SQL Server中是出了名弱。

最好的辦法就是在你的應用層做。

對於超過2個名稱的示例,您如何知道這些附加名稱會進入哪些字段?你保證他們將永遠只有一個姓氏?

+0

在我的情況我知道它只有一個姓 – Sam 2010-12-10 19:45:27

0

發現這對淨(沒有測試)

REVERSE(SUBSTRING(REVERSE([FullName]),1,FINDSTRING(REVERSE([FullName])," ",1))) 

您可以

SELECT REVERSE(SUBSTRING(REVERSE([FullName]),1,FINDSTRING(REVERSE([FullName])," ",1))) 
FROM Table 

測試它,如果它的工作原理,你就可以

UPDATE Table 
SET LastName = REVERSE(SUBSTRING(REVERSE([FullName]),1,FINDSTRING(REVERSE([FullName])," ",1))) 

我離開運動爲你的第一個名字。

+0

不工作。但是,感謝您的幫助 – Sam 2010-12-10 20:04:57

0

你剛剛在最後一個空間分裂?如果是的話這應該工作:

select 'Sam George Jack Peter' as FullName 
into #names 
union select 'Sam Adam Peter' 

select LEFT(FullName,LEN(FullName)-CHARINDEX(' ',REVERSE(FullName))) as FirstName 
    ,RIGHT(FullName,CHARINDEX(' ',REVERSE(FullName))-1) as LastName 
from #names 

編輯: 爲不帶空格的處理的名稱和把全名作爲姓氏

select 'Sam George Jack Peter' as FullName 
into #names 
union select 'Sam Adam Peter' 
union select 'Peter' 

select CASE 
      WHEN CHARINDEX(' ',FullName) = 0 THEN '' 
      ELSE LEFT(FullName,LEN(FullName)-CHARINDEX(' ',REVERSE(FullName))) 
     END as FirstName 
     ,CASE 
      WHEN CHARINDEX(' ',FullName) = 0 THEN FullName 
      ELSE LTRIM(RIGHT(FullName,CHARINDEX(' ',REVERSE(FullName)))) 
     END as LastName 
from #names 
+0

但是我有這麼多列像這樣我需要爲每條記錄寫入select? – Sam 2010-12-10 19:50:50

+0

它給我以下錯誤:消息536,級別16,狀態2,行1 傳遞給RIGHT函數的長度參數無效。 – Sam 2010-12-10 19:58:52

+1

@Sam,一旦你獲得了正確的語法,你可以編寫用戶定義的函數和用戶:http://www.databasejournal.com/features/mssql/article.php/3348181/User-Defined-Functions-in-Microsoft-SQL -Server-2000.htm – Unreason 2010-12-10 20:43:45