2017-01-18 3 views
1

SQL Serverのコードは、最初の名前、中間のイニシャル、およびタイトルを別々の項目として抽出しますが、問題なく動作しますSQL Serverを使用して名前とタイトルを別々の列に区切ります

ワーキング:

DOE,JOHN A MD - 

Last name: DOE 
First name: JOHN 
Middle initial:A 
Title: MD 

に動作していない:

DOE,JOHN MD - 

Last name: DOE 
First name: JOHN 
Middle initial: M 
Title: D 

コード私が現在使用している:何のミドルネームのイニシャルはありません

ISNULL(CASE 
      WHEN 0 = CHARINDEX(' ', RIGHT(Name, LEN(Name), CHARINDEX(',', Name))) 
      THEN LTRIM(SUBSTRING(Name, CHARINDEX(',', Name) + 1, 99)) 
      ELSE SUBSTRING(RIGHT(Name, LEN(Name) - CHARINDEX(',', Name)), 1, CHARINDEX(' ', RIGHT(Name, LEN(Name) - CHARINDEX(',', Name))) - 1) 
     END, '') AS FirstName, 
ISNULL(CASE 
      WHEN 0 = CHARINDEX(' ', RIGHT(Name, LEN(Name) - CHARINDEX(',', Name))) 
      THEN NULL 
      ELSE SUBSTRING(RIGHT(Name, LEN(Name) - CHARINDEX(',', Name)), CHARINDEX(' ', RIGHT(Name, LEN(Name) - CHARINDEX(',', Name))) + 1, 1) 
     END,'') as MiddleInitial, 
ISNULL(CASE 
      WHEN 0 = CHARINDEX(' ', SUBSTRING(Name, 1, CHARINDEX(',', Name) - 1)) 
      THEN SUBSTRING(Name, 1, CHARINDEX(',', Name) - 1) 
      ELSE SUBSTRING(SUBSTRING(Name, 1, CHARINDEX(',', Name) - 1), 1, CHARINDEX(' ', SUBSTRING(Name, 1, CHARINDEX(',', Name) - 1)) - 1) 
     END,'') as LastName, 
ISNULL(CASE 
      WHEN 0 = CHARINDEX(' ', RIGHT(Name, LEN(Name) - CHARINDEX(',', Name))) 
      THEN NULL 
      ELSE SUBSTRING(RIGHT(Name, LEN(Name) - CHARINDEX(',', Name)), CHARINDEX(' ', RIGHT(Name, LEN(Name) - CHARINDEX(',', Name))) + 2, 4) 
     END,'') as Spec, 
ISNULL(ProviderID, ' ') as provid, 
ISNULL(ServiceID,' ') as svcid, 
ISNULL(SpecialtyAbsServiceID,' ') sabsid 

ご協力いただければ幸いです。

ありがとうございます - マット

+1

としてベティジェーンが、これは* SQLで達成されるように*しているのか?まともな正規表現の実装を持つ言語であれば、これを処理できます。 MS SQL Serverにその機能があるかどうかは不明です。 –

+0

C#などの言語でこの種の処理を行う方がよいでしょう。 –

答えて

2

これは名前を解析する滑りやすい勾配ですが、これが役立ちます。

サンプルデータで動作しますが、複数の単語の名前が問題になります。例えばFirst Name

Declare @YourTable table (ID int,Name varchar(50)) 
Insert Into @YourTable values 
(1,'DOE,JOHN A MD'), 
(2,'DOE,JOHN MD') 

Select A.* 
     ,Last_Name = B.Pos1 
     ,First_Name = B.Pos2 
     ,Middle_Name = case when B.Pos4 is null then '' else B.Pos3 end 
     ,Title  = case when B.Pos4 is null then B.Pos3 else B.Pos4 end 
From @YourTable A 
Cross Apply (
       Select Pos1 = ltrim(rtrim(xDim.value('/x[1]','varchar(max)'))) 
         ,Pos2 = ltrim(rtrim(xDim.value('/x[2]','varchar(max)'))) 
         ,Pos3 = ltrim(rtrim(xDim.value('/x[3]','varchar(max)'))) 
         ,Pos4 = ltrim(rtrim(xDim.value('/x[4]','varchar(max)'))) 
       From (Select Cast('<x>' + replace((Select Replace(Replace(A.Name,',',' '),' ',' ') as [*] For XML Path('')),' ','</x><x>')+'</x>' as xml) as xDim) as A 
      ) B 

戻り

ID Name   Last_Name First_Name Middle_Name Title 
1 DOE,JOHN A MD DOE   JOHN  A   MD 
2 DOE,JOHN MD  DOE   JOHN     MD 
関連する問題