parsingr le prénom et le nom de la table SQL

J'ai une colonne dans ma database SQL Server 2008 qui contient c/o Full Name . J'ai des problèmes pour séparer les prénoms et les noms de famille. J'ai le c / o dans sa propre colonne, mais j'ai besoin du prénom / nom. Je sais qu'il y a un problème avec les deuxième et troisième déclarations de cas, mais je ne suis pas sûr de ce que je dois changer. Devrais-je stocker des variables d'index quelque part pour les referencer?

 Declare @t table ( [name] varchar(100) ) INSERT INTO @t ( Name ) SELECT Street1 FROM tblPeople WHERE CO = 'Y' AND LastName NOT LIKE 'SUMMERHAVEN INC' AND Street1 Like '%c/o%' SELECT [name], CHARINDEX(' ', [name]), CASE WHEN CHARINDEX(' ', [name]) > 0 THEN LEFT([name],CHARINDEX(' ',[name])-1) ELSE [name] END as CO, CASE WHEN CHARINDEX(' ', [name]) > 0 THEN SUBSTRING([name],CHARINDEX(' ',[name])+1, ( LEN([name]) - CHARINDEX(' ',[name])+1) ) ELSE NULL END as FIRST_NAME, CASE WHEN CHARINDEX(' ', [name]) > 0 THEN SUBSTRING([name],CHARINDEX(' ',[name])+1, ( LEN([name]) - CHARINDEX(' ',[name])+1) ) ELSE NULL END as LAST_NAME FROM @t 

Divulgation: c'est une mauvaise idée d'parsingr datatables comme ça, mais voilà:

 Declare @t table ( [name] varchar(100) ) insert into @t ( Name ) values ('c/o Full Name') SELECT CASE WHEN CHARINDEX(' ', [name]) > 0 THEN LEFT([name],CHARINDEX(' ',[name])-1) ELSE [name] END as CO, CASE WHEN CHARINDEX(' ', [name]) > 0 THEN SUBSTRING([name],CHARINDEX(' ',[name])+1, CHARINDEX(' ',[name]) ) ELSE NULL END as FIRST_NAME, CASE WHEN CHARINDEX(' ', [name]) > 0 THEN SUBSTRING([name],CHARINDEX(' ',[name], CHARINDEX(' ',[name])+1), len([name])) ELSE NULL END as LAST_NAME FROM @t 

À ma grande surprise, PARSENAME () était disponible en 2008

Considérer ce qui suit

 Declare @YourTable table (Name varchar(50)) Insert Into @YourTable values ('c/o Cher') ,('c/o John Smith') ,('John Smith') Select * ,FirstName=parsename(replace(lsortingm(rsortingm(replace(name,'c/o',''))),' ','.'),2) ,LastName =parsename(replace(lsortingm(rsortingm(replace(name,'c/o',''))),' ','.'),1) From @YourTable 

Résultats

 Name FirstName LastName c/o Cher NULL Cher c/o John Smith John Smith John Smith John Smith 

Voici une approche utilisant des expressions de table communes, afin que la logique permettant de find les espaces à percer soit raisonnablement auto-documentée.

 Declare @t table ( [name] varchar(100) ) insert into @t ( Name ) select 'one two three' union select 'a bc def' union select 'one two' union select 'one' ;with cte1 as ( select name ,charindex(' ', name) FirstSpace from @t ) , cte2 as ( select name , FirstSpace ,charindex(' ', name, FirstSpace+1) SecondSpace from cte1 ) select name , FirstSpace , SecondSpace , case when FirstSpace=0 then name else subssortingng(name, 1, FirstSpace-1) end Company , case when SecondSpace=0 then null else subssortingng(name, FirstSpace+1, SecondSpace-FirstSpace-1) end FirstName , case when SecondSpace=0 or SecondSpace=len(name) then null else subssortingng(name, SecondSpace+1, len(name)-SecondSpace) end LastName from cte2