SQL Server永久地分隔名字,姓氏和中间名

时间:2014-11-04 18:31:09

标签: sql sql-server

我有一个包含名字,姓氏和中间名字的表格,当有一个表格时,如下所示:

Name
Doe, John B
Smith, Bob

有些名字没有中间名,我只是想摆脱那些名字。到目前为止,我有这个问题:

SELECT   [table].[Name]
    ,LEFT([table].[Name], CHARINDEX(',', [table].[Name]) - 1) AS [Surname]
    ,REPLACE(SUBSTRING([table].[Name], CHARINDEX(',', [table].[Name]), LEN([table].[Name])), ',', '') AS [FirstName]
FROM    [table]

这给了我这个结果:

Surname  First Name
Doe      John B
Smith    Bob

有什么东西我可以添加,只是在它出现时摆脱中间的首字母?另外,我可以永久更改此数据,使其保留在两个单独的列中吗?

2 个答案:

答案 0 :(得分:0)

假设格式严格为Last, First <Optional initial>,首先没有初始值:

SUBSTRING([table].[Name], CHARINDEX(',', [table].[Name]) + 2, 
    LEN([table].[Name]) - CHARINDEX(',', [table].[Name]) 
    - CASE WHEN PATINDEX('% [A-Z]', [table].[Name]) > 0 THEN 3 ELSE 0 END)

如果要永久更改它,请创建一个包含所需内容的查询并覆盖这些值。

答案 1 :(得分:0)

查询:

WITH CTE AS (SELECT Name, LEFT(Name,CHARINDEX(',',RIGHT(Name,LEN(Name)-CHARINDEX(',',Name)))+CHARINDEX(',',Name)-1) AS [Last] FROM table)
SELECT [Last], LEFT(REPLACE(Name,Last+', ',''),CHARINDEX(' ',REPLACE(Name,Last+', ',''))-1) AS [First],
       RIGHT(REPLACE(Name,Last+', ',''),LEN(REPLACE(Name,Last+', ',''))-CHARINDEX(' ',REPLACE(Name,Last+', ',''))) AS Middle
FROM CTE

为了清晰起见,它使用CTE,它还考虑了许多特殊情况,包括带有后缀的名称(Jr,Sr,Esq等)。