0

誰かがフルネームフィールドの解析を手伝ってくれるかどうか疑問に思っていました. ラストネーム、ファーストネーム、ミドルネームのイニシャル、サフィックスに分けたいと思います。

これは、名前の入力に続いて、それらをどのように解析したいかです。

                           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

入力できるすべてのサフィックス値のリストがあります。つまり、

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

姓と残りの名前を分割するところまで来ましたが、残りの方法がよくわかりません。私はオラクル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';
4

5 に答える 5

2

これは、それを破るデータが常に存在する問題です。

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

あなたは「その人が入ることができる」という価値観に言及しています。値の入力方法を変更して、すでに分離されている値を取得できますか?

于 2009-06-16T20:25:47.847 に答える
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'
)));
于 2009-06-17T02:16:20.633 に答える
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;
于 2010-01-08T19:46:04.977 に答える