我有一个包含名字,姓氏和中间名字的表格,当有一个表格时,如下所示:
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
有什么东西我可以添加,只是在它出现时摆脱中间的首字母?另外,我可以永久更改此数据,使其保留在两个单独的列中吗?
答案 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等)。