在SQL Server中将名称拆分为FN,LN,MI等

时间:2015-02-02 18:13:21

标签: sql sql-server tsql

我有以下代码,适用于像'Foo,Bar S'这样的名字。和'Foo,Bar S.(TMCS)'。但它不适用于'Foo,Bar'。不确定我做错了什么或我错过了什么。我很困惑地跟上所有的charindexes和lefts,权利。

DECLARE @FullName VARCHAR(30)

SET @FullName = 'Foo, Bar'--'Foo, Bar S.' --'Foo, Bar S. (TMCS)'
;

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

2 个答案:

答案 0 :(得分:0)

以下代码完成了这项工作:

declare @test table (Name varchar(200))

insert @test
select 'Smith, John T' union all
select 'Alice, Smith T. (tmsc)' union all
select 'Johnson, Paul'

select * from @test

-- do the work
select LEFT(Name, CHARINDEX(', ', Name) - 1) LastName, 
        SUBSTRING(Name, CHARINDEX(', ', Name) + 2, CASE WHEN CHARINDEX(' ', Name, CHARINDEX(', ', Name) + 2) = 0 THEN LEN(Name) + 1 ELSE CHARINDEX(' ', Name, CHARINDEX(', ', Name) + 2) END - CHARINDEX(', ', Name) - 2) FirstName,
        RIGHT(Name, LEN(Name) - CASE WHEN CHARINDEX(' ', Name, CHARINDEX(', ', Name) + 2) = 0 THEN LEN(Name) ELSE CHARINDEX(' ', Name, CHARINDEX(', ', Name) + 2) END) Mid
from @test

答案 1 :(得分:0)

另一种解决方案:

DECLARE @FullName VARCHAR(30)
SET @FullName = 'Foo, Bar S.'--'Foo, Bar S.' --'Foo, Bar S. (TMCS)'

SELECT 
 LEFT(@FullName,CHARINDEX(',',@FullName)-1) AS First
,CASE WHEN LEN(@FullName) - LEN(REPLACE(@FullName, ' ', '')) < 2 Then NULL
      ELSE RIGHT(@FullName,CHARINDEX(' ',REVERSE(@FullName))-1) 
      END 
 AS Middle
,SUBSTRING(@FullName,
            CHARINDEX(' ',@FullName),
            CHARINDEX(' ',@FullName,Charindex(' ',@FullName+' ',+1) +1) - CHARINDEX(' ',@FullName))
 AS Last