如何在SQL服务器中将字符串RAJA MD,ELLIOTT H拆分为RAJA作为名字,MD作为TITLE,ELLIOTT



我正在从文件中提取数据,需要将full name拆分为first name, middle name, last name, and title列。

我尝试了LEFTRIGHT功能

这是一个滑坡,肯定会有惊喜/调整。 也就是说,也许这会为您完成一些繁重的工作。

交叉应用 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)
)

最新更新