2009-06-16 6 views
0

フルネームフィールドの解析に誰かが助けてくれるかどうか疑問に思っていました。 私はそれを姓、名、ミドルイニシャル、サフィックスに分けたいと思います。Parse Full NameフィールドOracle

ここでは、名前の後ろに、どのようにそれらを解析するかを入力します。

      Parsed Stuff Begins Here------------------------------------- 
    name     | lastname | firstname  | middle initial | suffix | 
---------------------------------------------------------------------------------------- 
PUBLIC, JOHN    | PUBLIC | JOHN    | NULL    | NULL 
PUBLIC, CHUN CH KIM  | PUBLIC | CHUN CH KIM  | NULL    | NULL 
PUBLIC, MARY L   | PUBLIC | MARY    | L    | NULL 
PUBLIC, FRED J JR   | PUBLIC | FRED    | J    | JR 
PUBLIC, SUE ELLEN J SR | PUBLIC | SUE ELLEN  | J    | SR 

私は私が姓と名の残りの部分を分割ポイントに得ている1は、入力することができるすべてのサフィックス値のリスト、すなわち

JR, SR, I,II,III,IV,V,VI 

を持っています、 しかし、私はかなり残りをする方法を理解することはできません。 私はOracle 10gを使用しています。

これは宿題に関する質問ではありません。それは私が仕事中に取り組んでいる実際の問題です。

は、ここで私は、現在持っているものです。

select id, 
     name, 
     substr(name,1, instr(name,',')-1) as lname, 
     substr(name,(instr(name,',')+1),length(name)) as rest_of_the_name 
from my_table 
where status='A'; 
+0

問題の声明だけでなく、あなたが持っているものを私たちに見せていただければ役に立ちます。私は「この宿題ですか?」という質問を繰り返します。 – akf

答えて

1

あなたは部分的にすでにそれを解決してきました - あなたは、サブクエリとしてクエリを使用して、少しずつ問題を打破することができます。例:

select id, name, lname, 
     case 
     when substr(x, -2, 1) = ' ' 
     then substr(x, length(x) - 2) 
     else x 
     end as first_name, -- e.g. "SUE ELLEN" 
     case 
     when substr(x, -2, 1) = ' ' 
     then substr(x, -1) 
     else null 
     end as middle_initial, -- e.g. "J" 
     suffix -- e.g. "SR" 
from (
select id, name, lname, suffix, 
     case when suffix is not null then 
     substr(rest_of_the_name, 1, length(rest_of_the_name)-length(suffix)-1) 
     else rest_of_the_name end 
     as x -- e.g. "SUE ELLEN J" 
from (
select id, name, lname, rest_of_the_name, 
     case 
     when substr(rest_of_the_name,-2) 
      in (' I',' V') 
     then substr(rest_of_the_name,-1) 
     when substr(rest_of_the_name,-3) 
      in (' JR',' SR',' II',' IV',' VI') 
     then substr(rest_of_the_name,-2) 
     when substr(rest_of_the_name,-4) 
      in (' III') 
     then substr(rest_of_the_name,-3) 
     else null 
     end as suffix -- e.g. "SR" 
from (
select id, 
     name, --e.g. "PUBLIC, SUE ELLEN J SR" 
     trim(substr(name,1, instr(name,',')-1)) as lname, -- e.g. "PUBLIC" 
     trim(substr(name,(instr(name,',')+1),length(name))) 
      as rest_of_the_name -- e.g. "SUE ELLEN J SR" 
from my_table 
where status='A' 
))); 
+0

btw:ボトムアップから読む:) –

+0

ありがとうJeffery! 私は少しだけクエリを変更してしまいました。私はdb内のほとんどの名前に対応するソリューションで終わってしまいました。 – zSynopsis

+0

手続き型ソリューションを使いやすくするために、データの一貫性に応じてかなり変更する必要があります。 –

2

これは、常にそれを壊しデータがあるでしょうそのために問題となっています。

イニシャルが2つある場合はどうなりますか? J Edgar Hooverのように、イニシャルが最初のものならどうなりますか?

「あなたが入力できる値」という言葉があります。値を入力してすでに分離されたままキャプチャする方法を変更できますか?

+0

ええ、私たちは、彼らがすべて異なる分野に取り込まれるように、入力される方法を変更するつもりですが、現在解析される必要がある約500万の名前があります。 – zSynopsis

+0

+1 "常にデータが破損します。" – Svante

+0

ベストセラーのために+1 - 最初に分けられた値をキャプチャしようとする。 –

0

ここで取得する最初に基づいて素朴な答えは、だと名字と同じ方法でMIを取得し、最後の名前として 'rest_of_the_name'からMIを削除します。

SELECT 
substr('John Q. Public',1, instr('John Q. Public',' ')-1) as FirstName, 
substr('John Q. Public',(instr('John Q. Public',' ')+1),length('John Q. Public')) as rest_of_the_name, 
substr(substr('John Q. Public',(instr('John Q. Public',' ')+1),length('John Q. Public')),1, instr(substr('John Q. Public',(instr('John Q. Public',' ')+1),length('John Q. Public')),' ')-1) as MI, 
replace(substr('John Q. Public',(instr('John Q. Public',' ')+1),length('John Q. Public')), substr(substr('John Q. Public',(instr('John Q. Public',' ')+1),length('John Q. Public')),1, instr(substr('John Q. Public',(instr('John Q. Public',' ')+1),length('John Q. Public')),' ')-1)) as LastName 
FROM DUAL; 
-2

選択SUBSTR(名前、INSTR(名前、 ' ')+1)姓AS、 SUBSTR(名、1、INSTR(名前、'')-1)何からのファーストネーム AS;