Разобрать полное имя поля Oracle - PullRequest
0 голосов
/ 16 июня 2009

Мне было интересно, сможет ли кто-нибудь помочь мне с разбором поля полного имени. Я хотел бы разделить его на фамилию, имя, отчество, суффикс.

Вот некоторые входные данные для имени, за которыми следует, как я хотел бы, чтобы они были проанализированы.

                           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

Я дошел до того, что разделил фамилию и остальную часть имени, но я не могу понять, как сделать все остальное. Я пользуюсь оракулом 10г.

Это не домашнее задание. Это актуальная проблема, над которой я работаю на работе.

Вот что у меня сейчас есть:

 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 ]

2 голосов
/ 17 июня 2009

Это проблема, для которой всегда будут данные, которые ее нарушают.

Что, если есть 2 инициала? Что если инициалы будут первыми, как у Эдгара Гувера?

Вы упоминаете значения, "которые можно ввести". Можете ли вы изменить способ ввода значений, чтобы зафиксировать их уже разделенными?

1 голос
/ 17 июня 2009

Вы уже частично решили его - вы можете использовать свой запрос в качестве подзапроса и разбить проблему пополам, например ::

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 голосов
/ 03 декабря 2013

Выберите SUBSTR (имя, INSTR (имя, '') +1) AS фамилия, SUBSTR (name, 1, INSTR (name, '') -1) AS имя от чего бы то ни было;

0 голосов
/ 08 января 2010

Вот простой ответ, основанный на извлечении имени и фамилии, извлечении MI так же, как и имени, и удалении MI из 'rest_of_the_name' в качестве фамилии.

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...