繁体   English   中英

使用SQL Server将名称和标题分成单独的列

[英]Separate name and title into separate columns using SQL Server

我构造了SQL Server代码,该代码将从表中提取出名字,姓氏,中间名首字母和标题作为单独的项目,这很好,但是在没有中间名首字母的情况下我遇到了问题:

工作:

DOE,JOHN A MD - 

Last name: DOE
First name: JOHN
Middle initial:A
Title: MD

无法运作:

DOE,JOHN MD -

Last name: DOE
First name: JOHN
Middle initial: M
Title: D

我当前使用的代码:

ISNULL(CASE  
          WHEN 0 = CHARINDEX(' ', RIGHT(Name, LEN(Name), CHARINDEX(',', Name))) 
             THEN LTRIM(SUBSTRING(Name, CHARINDEX(',', Name) + 1, 99)) 
          ELSE SUBSTRING(RIGHT(Name, LEN(Name) - CHARINDEX(',', Name)), 1, CHARINDEX(' ', RIGHT(Name, LEN(Name) - CHARINDEX(',', Name))) - 1)
       END, '') AS FirstName,
ISNULL(CASE 
          WHEN 0 = CHARINDEX(' ', RIGHT(Name, LEN(Name) - CHARINDEX(',', Name))) 
             THEN NULL 
             ELSE SUBSTRING(RIGHT(Name, LEN(Name) - CHARINDEX(',', Name)), CHARINDEX(' ', RIGHT(Name, LEN(Name) - CHARINDEX(',', Name))) + 1, 1) 
       END,'') as MiddleInitial,
ISNULL(CASE 
          WHEN 0 = CHARINDEX(' ', SUBSTRING(Name, 1, CHARINDEX(',', Name) - 1)) 
             THEN SUBSTRING(Name, 1, CHARINDEX(',', Name) - 1) 
             ELSE SUBSTRING(SUBSTRING(Name, 1, CHARINDEX(',', Name) - 1), 1, CHARINDEX(' ', SUBSTRING(Name, 1, CHARINDEX(',', Name) - 1)) - 1) 
       END,'') as LastName,
ISNULL(CASE 
          WHEN 0 = CHARINDEX(' ', RIGHT(Name, LEN(Name) - CHARINDEX(',', Name))) 
             THEN NULL 
             ELSE SUBSTRING(RIGHT(Name, LEN(Name) - CHARINDEX(',', Name)), CHARINDEX(' ', RIGHT(Name, LEN(Name) - CHARINDEX(',', Name))) + 2, 4)
       END,'') as Spec,
ISNULL(ProviderID, ' ') as provid,
ISNULL(ServiceID,' ') as svcid,
ISNULL(SpecialtyAbsServiceID,' ') sabsid

任何帮助将不胜感激!

谢谢-马特

这是一个滑坡的解析名称,但这可能有所帮助。

它适用于示例数据,但是多字名称将是一个问题。 例如, Betty Jane作为First Name

Declare @YourTable table (ID int,Name varchar(50))
Insert Into @YourTable values
(1,'DOE,JOHN A MD'),
(2,'DOE,JOHN MD')

Select A.*
      ,Last_Name   = B.Pos1
      ,First_Name  = B.Pos2
      ,Middle_Name = case when B.Pos4 is null then '' else B.Pos3 end
      ,Title       = case when B.Pos4 is null then B.Pos3 else B.Pos4 end
 From @YourTable A
 Cross Apply (
                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)')))
                From  (Select Cast('<x>' + replace((Select Replace(Replace(A.Name,',',' '),'  ',' ') as [*] For XML Path('')),' ','</x><x>')+'</x>' as xml) as xDim) as A 
             ) B

返回

ID  Name            Last_Name   First_Name  Middle_Name Title
1   DOE,JOHN A MD   DOE         JOHN        A           MD
2   DOE,JOHN MD     DOE         JOHN                    MD

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM