Supprimer et split datatables en plusieurs colonnes dans une instruction select

J'ai des données comme le tableau suivant

texte alt

Je veux enlever des Titres (M. Mlle, Dr etc) du nom et je veux split des données en Prénom et nom si deux noms existent.

Je veux ceci dans une déclaration choisie. Je peux supprimer le titre à l'aide de l'instruction CASE, mais je ne peux pas split le nom en deux dans la même instruction.

Je veux des données comme celle-ci mais dans une instruction select, le titre supprimé et le nom divisé.

texte alt

Vous pouvez le faire assez facilement avec la sous-string. Vous voulez split la string par des espaces, puis ignorer le premier élément dans l'index, à peu près comme ceci:

SELECT SUBSTRING(@ourName, 1, CHARINDEX(' ', @ourName)) AS [First], SUBSTRING(@ourName, CHARINDEX(' ', @ourName) + 2, LEN(@ourName)) AS[Last] 

Non testé, mais c'est assez proche de ce que vous voulez faire. Vous allez casser la string dans un tableau comme:

[0] Préfixe [1] Prénom [2] Nom

Et seulement en saisissant 1 et 2. Cela va casser, cependant s'il n'y a pas de préfixe.

Essayez le file UDF suivant

 create function dbo.ExtractName(@TheName VARCHAR(200),@Which CHAR(1) ) returns VARCHAR(100) as begin declare @Ans VARCHAR(100) -- Get rid of common saluations SET @theName = replace(replace(@theName,'mr.',''),'mrs.','') SET @theName = replace(replace(@theName,'ms',''),'miss','') SET @theName = replace(replace(@theName,'dr.',''),'sir','') SET @Ans = rsortingm(lsortingm(@theName))+' ' -- Assume last name if @Which = 'L' set @ans = rsortingm(subssortingng(@ans,charindex(' ',@ans)+1,99)) else set @ans = left(@ans,charindex(' ',@ans)-1) if len(@ans)='' set @ans= null return @ans end go print dbo.ExtractName('Mr. Rick Pepper','F') print dbo.ExtractName('Mr. Rick Pepper','L') 

Extraire des noms peut être très complexe, car il existe un grand nombre de préfixes possibles, parfois les noms sont stockés en dernier, d'abord. Certains noms ont des suffixes, comme Jr. ou PHD. J'espère que cette UDF vous donne un sharepoint départ …

Vous pouvez combiner la réponse de Jeremy avec des instructions CASE concaténées pour répondre à vos besoins. Ce sera une phrase assez compliquée mais ça peut marcher.

Essaye ça

 declare @tbl table (GoodName varchar(50)) insert into @tbl select 'Mr.Rick Pepper' insert into @tbl select 'Miss Lara Harper' insert into @tbl select 'Mrs Kim' insert into @tbl select 'Dr.Alan White' insert into @tbl select 'Adam Jones' insert into @tbl select 'William' insert into @tbl select 'Sir Clark' 

–Le programme démarre

 select case when CHARINDEX(',',FilteredName) = 0 then FilteredName else SUBSTRING(FilteredName,0,CHARINDEX(',',FilteredName)) end as FirstName ,case when CHARINDEX(',',FilteredName) = 0 then Null else SUBSTRING(FilteredName,CHARINDEX(',',FilteredName)+1,LEN(FilteredName)) end as LastName from ( select REPLACE(LTRIM(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(GoodName,'Mr.',''),'Miss',''),'Mrs',''),'Dr.',''),'Sir','')),' ',',') as FilteredName from @tbl )x(FilteredName) 

Sortie

Prénom nom de famille

 Rick Pepper Lara Harper Kim NULL Alan White Adam Jones William NULL Clark NULL