Como dividir os valores de uma única coluna para vários valores de coluna?

Eu tenho um problema ao dividir valores de coluna única para vários valores de coluna.

Por exemplo:

Name ------------ abcd efgh ijk lmn opq asd j. asdjja asb (asdfas) asd asd 

e eu preciso da saída algo assim:

 first_name last_name ---------------------------------- abcd efgh ijk opq asd asdjja asb asd asd null 

O nome do meio pode ser omitido (não é necessário um nome do meio) As colunas já estão criadas e precisam inserir os dados dessa coluna de Name único.

Sua abordagem não vai lidar com muitos nomes corretamente, mas …

 SELECT CASE WHEN name LIKE '% %' THEN LEFT(name, Charindex(' ', name) - 1) ELSE name END, CASE WHEN name LIKE '% %' THEN RIGHT(name, Charindex(' ', Reverse(name)) - 1) END FROM YourTable 

Uma alternativa para Martin

 select LEFT(name, CHARINDEX(' ', name + ' ') -1), STUFF(name, 1, Len(Name) +1- CHARINDEX(' ',Reverse(name)), '') from somenames 

Tabela de amostra

 create table somenames (Name varchar(100)) insert somenames select 'abcd efgh' insert somenames select 'ijk lmn opq' insert somenames select 'asd j. asdjja' insert somenames select 'asb (asdfas) asd' insert somenames select 'asd' insert somenames select '' insert somenames select null 

O que você precisa é de uma function definida pelo usuário dividida. Com isso, a solução parece

 With SplitValues As ( Select T.Name, Z.Position, Z.Value , Row_Number() Over ( Partition By T.Name Order By Z.Position ) As Num From Table As T Cross Apply dbo.udf_Split( T.Name, ' ' ) As Z ) Select Name , FirstName.Value , Case When ThirdName Is Null Then SecondName Else ThirdName End As LastName From SplitValues As FirstName Left Join SplitValues As SecondName On S2.Name = S1.Name And S2.Num = 2 Left Join SplitValues As ThirdName On S2.Name = S1.Name And S2.Num = 3 Where FirstName.Num = 1 

Aqui está uma function de divisão de amostra:

 Create Function [dbo].[udf_Split] ( @DelimitedList nvarchar(max) , @Delimiter nvarchar(2) = ',' ) RETURNS TABLE AS RETURN ( With CorrectedList As ( Select Case When Left(@DelimitedList, Len(@Delimiter)) <> @Delimiter Then @Delimiter Else '' End + @DelimitedList + Case When Right(@DelimitedList, Len(@Delimiter)) <> @Delimiter Then @Delimiter Else '' End As List , Len(@Delimiter) As DelimiterLen ) , Numbers As ( Select TOP( Coalesce(DataLength(@DelimitedList)/2,0) ) Row_Number() Over ( Order By c1.object_id ) As Value From sys.columns As c1 Cross Join sys.columns As c2 ) Select CharIndex(@Delimiter, CL.list, N.Value) + CL.DelimiterLen As Position , Substring ( CL.List , CharIndex(@Delimiter, CL.list, N.Value) + CL.DelimiterLen , CharIndex(@Delimiter, CL.list, N.Value + 1) - ( CharIndex(@Delimiter, CL.list, N.Value) + CL.DelimiterLen ) ) As Value From CorrectedList As CL Cross Join Numbers As N Where N.Value < = DataLength(CL.List) / 2 And Substring(CL.List, N.Value, CL.DelimiterLen) = @Delimiter ) 
 ;WITH Split_Names (Name, xmlname) AS ( SELECT Name, CONVERT(XML,'' + REPLACE(Name,' ', '') + '') AS xmlname FROM somenames ) SELECT xmlname.value('/Names[1]/name[1]','varchar(100)') AS first_name, xmlname.value('/Names[1]/name[2]','varchar(100)') AS last_name FROM Split_Names 

e também verifique o link abaixo para referência

http://jahaines.blogspot.in/2009/06/converting-delimited-string-of-values.html

Aqui está como eu fiz isso em um database SQLite:

SELECT SUBSTR(name, 1,INSTR(name, " ")-1) as Firstname, SUBSTR(name, INSTR(name," ")+1, LENGTH(name)) as Lastname FROM YourTable;

Espero que ajude.

 SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(rent, ' ', 1), ' ', -1) AS currency, SUBSTRING_INDEX(SUBSTRING_INDEX(rent, ' ', 3), ' ', -1) AS rent FROM tolets