我有以下代码,适用于像'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
答案 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