正如其他人所評論的那樣,這個問題太模糊(並且問題描述太複雜),無法提供特別有用的答案,但我仍會嘗試。
我們可以提出一個解決方案,如果我們做一些假設這個名字值你想分裂:
- 每個名稱中包含2至4「字」,每一個空格隔開
- 2字的名字被形成:
[First Name] [Last Name]
- 3字的名字被形成:
[First Name] [Last Name] [Suffix]
- 4字的名字被形成:
[First Name] [Middle Name] [Last Name] [Suffix]
在這種情況下,我們可以解決如下(如果在一個叫names
與單個列表中存在我們的名字叫Name
:
SELECT
SUBSTRING(Name, 1, CHARINDEX(' ', Name) - 1) AS FirstName
,CASE LEN(Name) - LEN(REPLACE(Name, ' ', '')) + 1
WHEN 2 THEN NULL
WHEN 3 THEN NULL
WHEN 4 THEN SUBSTRING(RIGHT(Name, LEN(Name) - CHARINDEX(' ', Name)), 1, CHARINDEX(' ', RIGHT(Name, LEN(Name) - CHARINDEX(' ', Name))) - 1)
END AS [Middle Name]
,CASE LEN(Name) - LEN(REPLACE(Name, ' ', '')) + 1
WHEN 2 THEN RIGHT(Name, LEN(Name) - CHARINDEX(' ', Name))
WHEN 3 THEN SUBSTRING(RIGHT(Name, LEN(Name) - CHARINDEX(' ', Name)), 1, CHARINDEX(' ', RIGHT(Name, LEN(Name) - CHARINDEX(' ', Name))) - 1)
WHEN 4 THEN SUBSTRING(RIGHT(Name, LEN(Name) - CHARINDEX(' ', Name, CHARINDEX(' ', Name) + 1)), 1, CHARINDEX(' ', RIGHT(Name, LEN(Name) - CHARINDEX(' ', Name, CHARINDEX(' ', Name) + 1))) - 1)
END AS lastName
,CASE LEN(Name) - LEN(REPLACE(Name, ' ', '')) + 1
WHEN 2 THEN NULL
WHEN 3 THEN REVERSE(SUBSTRING(REVERSE(Name), 1, CHARINDEX(' ', REVERSE(Name)) - 1))
WHEN 4 THEN REVERSE(SUBSTRING(REVERSE(Name), 1, CHARINDEX(' ', REVERSE(Name)) - 1))
END AS Suffix
FROM names
這還不是最完美的解決方案,但它說明的用法CHARINDEX
和SUBSTRING
可以應用來分解像這樣的字符串。這個查詢肯定有一些冗餘,可以用這個查詢來實現,而且更優雅的方法來實現它(再加上它可能不適合你的數據集,因爲上面的假設),但是希望這對你有幫助的出發點。
更簡潔的解決方案可能是創建一個函數,該函數需要2個參數 - 一個字符串和一個整數,用於指示您希望從該字符串返回哪個「字」。然後,您可以從類似的CASE
邏輯中調用此函數,以根據需要返回名稱中的第一個,第二個,第三個或第四個單詞。
如果您需要能夠處理[First Name] [Middle Name] [Last Name]
表單中的3個單詞的名稱(如我懷疑的那樣),您可能需要構建可能的後綴列表並使用該列表來確定每個3個單詞名稱相應地有後綴或中間名。
[TSQL聲明,以名稱後綴(JR,鍶,IV等)移動到另一字段(的可能的複製http://stackoverflow.com/questions/3711944/tsql-statement-to-move-名稱後綴-rr-iv-etc-into-another-field) – Aron
這是一個不平凡的問題,特別是因爲生活在英語國家的許多文化都有文化命名系統,甚至沒有「中間名稱」。例如,瑪麗亞·德洛斯·戈麥斯·德拉克魯茲,瑪麗·保羅·懷特(瑪麗·保羅·懷特)(她的中間名是保羅,還是她有雙重姓氏?)。沒有簡單的方法來正確地做你想要的名字,通常遇到的名字,因爲歧義,你不能沒有更多的信息解決。 – hatchet
對這個問題的任何答案都將基於假設,主要是你的名字永遠是FML,有或沒有後綴。 @hatchet提到了太多的可能性。對此,有幾十個類似的問題。所有對這些問題的回答只有在永遠不變,定義的變量限制下才是正確的。所以,如果你的數據包含了你所顯示的更多變體,你將會有很多CASE語句,並且/或者將不得不與其他人一起來回處理,直到處理完所有異常。如果你敢開始尋找空白空間 – scsimon