我正在从文件中提取数据,需要将full name
拆分为first name, middle name, last name, and title
列。
我尝试了LEFT
和RIGHT
功能
这是一个滑坡,肯定会有惊喜/调整。 也就是说,也许这会为您完成一些繁重的工作。
交叉应用 B 将拆分逗号上的字符串(必需且期望只有一个(
交叉应用 C 将在空间上拆分 B 的 Pos1
交叉应用 D 将在空间上拆分 B 的 Pos2
然后就变成了寻找模式的小问题
例
Declare @YourTable Table ([ID] varchar(50),[FullName] varchar(50))
Insert Into @YourTable Values
(1,'Raja MD, Elliott H')
,(2,'Jones, David')
,(3,'Smith PhD, Mary Ellen')
,(4,'Allen Franks MD, Richard R.')
Select A.*
,FName=D.Pos1 + case when len(D.Pos2) > 2 Then ' '+D.Pos2 else '' end
,MName=case when len(D.Pos2)<3 then D.Pos2 else '' end
,LName=case when C.Pos3 is null then C.Pos1 else C.Pos1+' '+C.Pos2 end
,Title=case when C.Pos3 is null then IsNull(C.Pos2,'') else C.Pos3 end
From @YourTable A
Cross Apply [dbo].[tvf-Str-Parse-Row](FullName,',') B
Cross Apply [dbo].[tvf-Str-Parse-Row](B.Pos1 ,' ') C
Cross Apply [dbo].[tvf-Str-Parse-Row](B.Pos2 ,' ') D
返回
ID FullName FName MName LName Title
1 Raja MD, Elliott H Elliott H Raja MD
2 Jones, David David Jones
3 Smith PhD, Mary Ellen Mary Ellen Smith PhD
4 Allen Franks MD, Richard R. Richard R. Allen Franks MD
TVF,如果有兴趣
CREATE FUNCTION [dbo].[tvf-Str-Parse-Row] (@String varchar(max),@Delimiter varchar(10))
Returns Table
As
Return (
Select Pos1 = ltrim(rtrim(xDim.value('/x[1]','varchar(max)')))
,Pos2 = ltrim(rtrim(xDim.value('/x[2]','varchar(max)')))
,Pos3 = ltrim(rtrim(xDim.value('/x[3]','varchar(max)')))
,Pos4 = ltrim(rtrim(xDim.value('/x[4]','varchar(max)')))
,Pos5 = ltrim(rtrim(xDim.value('/x[5]','varchar(max)')))
,Pos6 = ltrim(rtrim(xDim.value('/x[6]','varchar(max)')))
,Pos7 = ltrim(rtrim(xDim.value('/x[7]','varchar(max)')))
,Pos8 = ltrim(rtrim(xDim.value('/x[8]','varchar(max)')))
,Pos9 = ltrim(rtrim(xDim.value('/x[9]','varchar(max)')))
From ( values (cast('<x>' + replace((Select replace(@String,@Delimiter,'§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>')+'</x>' as xml))) A(xDim)
)