Parse campo Nome completo do Oracle
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';
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;