我会将您的示例添加到内存表中,以便我们可以如下测试它们:-(您不需要这个)
Declare @NameTable table (fullname varchar(250))
insert into @NameTable values
('LASTNAME,FIRSTNAME MIDDLENAME'),
('LASTNAME,FIRSTNAME,MIDDLENAME'),
('LAST NAME,FIRSTNAME MIDDLENAME'),
('LAST NAME,FIRSTNAME (MIDDLENAME)'),
('LASTNAME,FIRSTNAME (NICKNAME) MIDDLENAME'),
('LASTNAME,FIRSTNAME') -- no middle name
让我们试着把它分解成一些更小的步骤,首先取出括号,然后是姓氏,然后继续直到我们得到所有部分。
;with FindBrackts as (
/* get rid of brackets */
select *,CHARINDEX('(',fullname) bStart,CHARINDEX(')',fullname) bEnd from @NameTable
),RemoveBrackts as (
select case when bStart>0 then substring(fullname,1,bStart-1)+substring(fullname,bEnd+2,len(fullname)-bEnd+1)
else fullname end fullname from FindBrackts)
,LastNameAndTheRest as (
select substring(fullname,1,CHARINDEX(',',fullname)-1) [LASTNAME]
,substring(fullname,CHARINDEX(',',fullname)+1,len(fullname)-CHARINDEX(',',fullname)) [TheRest] from RemoveBrackts
),LastFirstMiddle as (
select [LASTNAME],[TheRest],CHARINDEX(',',replace([TheRest],' ',',')) [mStart] from LastNameAndTheRest
)
select [LASTNAME]
,case when mStart=0 then [TheRest] else substring([TheRest],1,[mStart]-1) end FIRSTNAME
,case when mStart=0 then null else substring([TheRest],[mStart]+1,len([TheRest])-[mStart]) end MIDDLENAME
from LastFirstMiddle
结果将如下所示:-
LASTNAME FIRSTNAME MIDDLENAME
======== ========= ==========
LASTNAME FIRSTNAME MIDDLENAME
LASTNAME FIRSTNAME MIDDLENAME
LAST NAME FIRSTNAME MIDDLENAME
LAST NAME FIRSTNAME NULL
LASTNAME FIRSTNAME MIDDLENAME
如果这有帮助并且您发现还有更多条件,请添加它们,并可能更新查询以将它们考虑在内。
在 SQL Fiddle http://sqlfiddle.com/#!18/2dd42/2/0 上也是一样的
或者如果你不想要任何 CTE,它有点长,但你可以试试下面的:-
select
SUBSTRING(fullname, 0, CHARINDEX(',', fullname)) AS LastName
,SUBSTRING(replace(SUBSTRING(fullname,CHARINDEX(',', fullname)+1,len(fullname)-CHARINDEX(',', fullname)),' ',','),1,CHARINDEX(',',replace(SUBSTRING(fullname,CHARINDEX(',', fullname)+1,len(fullname)-CHARINDEX(',', fullname)),' ',','))-1) [FirstName]
,SUBSTRING(fullname,2+len(fullname)-CHARINDEX(',',reverse(replace(fullname,' ',','))),len(fullname)) MiddleName
from @NameTable
结果如下,(与之前的解决方案有点不同)
LastName FirstName MiddleName
======== ========= ==========
LASTNAME FIRSTNAME MIDDLENAME
LASTNAME FIRSTNAME MIDDLENAME
LAST NAME FIRSTNAME MIDDLENAME
LAST NAME FIRSTNAME (MIDDLENAME)
LASTNAME FIRSTNAME MIDDLENAME
如果没有 Middlename ,CTE 将处理它,但 select 需要更新为以下内容:-
select
SUBSTRING(fullname, 0, CHARINDEX(',', fullname)) AS LastName
,case when CHARINDEX(',',replace(SUBSTRING(fullname,CHARINDEX(',', fullname)+1,len(fullname)-CHARINDEX(',', fullname)),' ',','))>0 then
SUBSTRING(replace(SUBSTRING(fullname,CHARINDEX(',', fullname)+1,len(fullname)-CHARINDEX(',', fullname)),' ',','),1,CHARINDEX(',',replace(SUBSTRING(fullname,CHARINDEX(',', fullname)+1,len(fullname)-CHARINDEX(',', fullname)),' ',','))-1)
else replace(SUBSTRING(fullname,CHARINDEX(',', fullname)+1,len(fullname)-CHARINDEX(',', fullname)),' ',',') end [FirstName]
,case when CHARINDEX(',',replace(SUBSTRING(fullname,CHARINDEX(',', fullname)+1,len(fullname)-CHARINDEX(',', fullname)),' ',','))>0 then
SUBSTRING(fullname,2+len(fullname)-CHARINDEX(',',reverse(replace(fullname,' ',','))),len(fullname))
else NULL end MiddleName
from @NameTable
这有点长,可能会写得更短。无论如何,结果如下:-
LastName FirstName MiddleName
========= ========= ==========
LASTNAME FIRSTNAME MIDDLENAME
LASTNAME FIRSTNAME MIDDLENAME
LAST NAME FIRSTNAME MIDDLENAME
LAST NAME FIRSTNAME (MIDDLENAME)
LASTNAME FIRSTNAME MIDDLENAME
LASTNAME FIRSTNAME NULL