2017-06-08 2 views
1

私は従業員のフルネームとして列に長い文字列を持っていますが、私はその名前、ミドルネーム、ラストネームでそれを分割したいと思います。例えば、私はAndrade, Maria Sandra(lname、(スペース)fname(スペース)mname)を持っています fname = Maria、lname = SandraのようなAndradeとミドルネームのようになります。サブストリングを使用して列を分割する

私の列には一般にlname、fnameがあります。

私はLNAMEを分割することですが、FNAMEとMNAME

SELECT EmployeeName as [full name ], SUBSTRING(EmployeeName,CHARINDEX(',',EmployeeName)+1,LEN(EmployeeName)) as[First name ] 
    ,SUBSTRING(EmployeeName,0,CHARINDEX(',',EmployeeName)) [Last Name] 
, SUBSTRING(SUBSTRING(EmployeeName,CHARINDEX(',',EmployeeName)+1,LEN(EmployeeName)),CHARINDEX(' ',EmployeeName),LEN (SUBSTRING(EmployeeName,CHARINDEX(',',EmployeeName),LEN(EmployeeName)))) as[Middle name ] 
FROM test$` 
+1

これは100回尋ねられており、100%の偽の証明方法はありません。もしJRがあれば、もしIIIがあれば、ミドルネームが2つあればどうなりますか?多くの文化に共通するような2つの姓がある場合はどうすればいいですか?...などです。これを行う努力は後で問題を複雑にするだけです。あなたのデータを標準化し、これを将来的に避けてください。 – scsimon

+0

私はちょうどそれを打ち破る必要があります。もし特定の場合は、私はそれを手動で修正します。 – user7776356

+0

この方法論は、プログラミングのあらゆるパラダイムに逆らっています。 – scsimon

答えて

1

のためのない正しい破壊はここでは、あなたのデータを正規化しなければならない理由は、完璧な理由です。

declare @table table(thename varchar(500)) 
insert into @table 
values 
('Andrade, Maria Sandra'), 
('Andrade, Maria'), 
('Andrade, Maria Sandra OhSnap') 

select 
    left(thename,CHARINDEX(',',thename) - 1) as LastName 
    ,substring(thename,charindex(' ',thename),case when charindex(' ',thename) + charindex(' ',reverse(thename)) > len(thename) then charindex(' ',reverse(thename)) else len(thename) - (charindex(' ',thename) + charindex(' ',reverse(thename))) + 1 end) as FirstName 
    ,case when charindex(' ',thename) + charindex(' ',reverse(thename)) - 1 = len(thename) then null else right(thename,charindex(' ',reverse(thename))) end as MiddleName 
from @table 
関連する問題