Pergunta

Eu queria saber se alguém poderia me ajudar com a análise de um campo de nome completo. Eu gostaria de separá-lo em sobrenome, nome, inicial do meio, sufixo.

Aqui estão algumas entradas para nome seguido pela forma como eu gostaria que eles para ser analisado.

                           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

Eu tenho uma lista de todos os valores sufixo que um é capaz de entrar, i.

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

Eu comecei a um ponto onde eu dividir o sobrenome eo resto do nome, mas eu não consigo descobrir como fazer o resto. Estou usando o Oracle 10g.

Esta não é uma pergunta lição de casa. É um problema real que eu estou trabalhando no trabalho.

Aqui está o que eu tenho atualmente:

 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';
Foi útil?

Solução

Você já resolveu parcialmente já - você pode usar sua consulta como uma subconsulta e quebrar o problema para baixo pouco a pouco, por exemplo:

.
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'
)));

Outras dicas

Este é um problema para o qual haverá sempre dados que quebra-lo.

E se existem 2 iniciais? E se as iniciais são de primeira, como J Edgar Hoover?

Você menciona valores "que um é capaz de entrar." você pode mudar a forma como os valores são inseridos para capturá-los já separado?

Aqui está uma resposta sem sofisticação, com base na recuperação do primeiro e último nome, recuperando o MI da mesma forma que o primeiro nome, a remoção do MI do 'rest_of_the_name' como o último nome.

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;

Selecionar SUBSTR (nome, INSTR (nome, ' ') +1) AS sobrenome, SUBSTR (nome, 1, -INSTRUÇOÑES (nome, ' ') -1) COMO primeironome de qualquer;

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top