Dúvidas SELECT ( PRENOME + NOME + SOBRENOME )

Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
Avatar do usuário
vitellozzi
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 50
Registrado em: Qua, 15 Set 2010 9:53 am
Localização: Itatiba

Olá Pessoal,

Para variar dúvidas ...

Fiz um SELECT usando o

Selecionar tudo

LENGTH(CAMPO_NOME) <7
Exemplo: JOAO AP. DA S. FERREIRA e FRANCISCO AP. DA SILVA.
Se tivesse os seguintes nomes com esse comando o sistema iria me informar o JOAO. Meu problema é o seguinte:

Preciso elaborar um SELECT para pegar o nome ou segundo nome para comparar se está abreviado.

Exemplo:

No campo nome igual a JOAO AP. DA S. FERREIRA

Selecionar tudo

PRENOME = JOAO
NOME = AP.
SEGUNDO NOME = S. ( abreviação de SILVA ou SILVEIRA )
SOBRENOME = FERREIRA
ou seja o SELECT deverá ignorar o PRENOME = JOAO
capturar o NOME = AP. e O SEGUNDO NOME = S.
ignorar o SOBRENOME, executando tal SELECT teria o NOME e o SEGUNDO NOME pois estão abreviados. É possível ?
gfkauer
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 389
Registrado em: Ter, 27 Jul 2010 1:34 pm
Localização: Sapiranga - RS
Contato:
Quem falou que programar era fácil??

Quanto mais dificil for a implementação mais valorizado seu trabalho será!

Acessem: www.gfkauer.com.br

Possivel é. Baseado nestes exemplos que tu listou acima, o que você faria com as preposições da?
Avatar do usuário
vitellozzi
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 50
Registrado em: Qua, 15 Set 2010 9:53 am
Localização: Itatiba

No nome se tiver o " DA " ou " DE ", também seria algo a ser desconsiderado como o " espaço ".

Para mim é muito complexo elaborar esse SELECT.

Se possível me ajudar. Desde já agradeço.
SergioLBJr
Rank: Oracle Guru
Rank: Oracle Guru
Mensagens: 448
Registrado em: Ter, 16 Jun 2009 3:07 pm
Localização: Parobé - RS
Sérgio Luiz Bonemberger Junior
Programador Junior
Parobé RS

[]s

Cara só para esclarecer alguns pontos.

Tu possui tudo em um campo só?
Tu gostaria de pegar qualquer parte deste campo que estivesse abreviada, ou apenas o nome e o segundo nome?
Sempre que há alguma abreviação a mesma possui um ponto "." no final?
Avatar do usuário
vitellozzi
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 50
Registrado em: Qua, 15 Set 2010 9:53 am
Localização: Itatiba

Olá Sergio, Bom Dia.

Exatamente ... os registros estão todos em um só campo.
Gostaria de comparar e assim pegar o registro caso o nome estiver com abreviação ou a mesma possui um ponto " . ".

Exemplo de SELECT que estou precisando seria obter os nomes com essas abreviações :

JOAO AP. DA S. FERREIRA
LUCAS AP ( sem o ponto ) DA S. FERREIRA
MARIA A. DE SOUZA S. FERREIRA

Desde já agradeço !!!
Avatar do usuário
vitellozzi
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 50
Registrado em: Qua, 15 Set 2010 9:53 am
Localização: Itatiba

Desculpas ... acabei criando um tópico igual a esse ... :

http://glufke.net/oracle/viewtopic.php? ... highlight=

Favor desconsiderar !!!
gfkauer
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 389
Registrado em: Ter, 27 Jul 2010 1:34 pm
Localização: Sapiranga - RS
Contato:
Quem falou que programar era fácil??

Quanto mais dificil for a implementação mais valorizado seu trabalho será!

Acessem: www.gfkauer.com.br

Com base no que eu havia compreendido o mais próximo que consegui imaginar em sql seria isso:

Selecionar tudo

Select Case
         When instr(&nome, '.') != 0 Then
           substr(&nome, instr(&nome, ' ', -1, 2)+1, instr(&nome, '.')-instr(&nome, ' ', -1, 2)+1)
         Else
           'Não possui nomes abreviados'
       End abreviacao
  From dual
Da uma olhada se com isso tu consegue ter alguma ideia melhor...
Espero que consiga ler os dados conforme nescessidade.
Avatar do usuário
vitellozzi
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 50
Registrado em: Qua, 15 Set 2010 9:53 am
Localização: Itatiba

Não achei outra solução a não ser essa ... não sei se é a melhor, mas foi a que tive mais sucesso por enquanto ... veja :

Selecionar tudo

SELECT VU.NRREGISTRO_USUARIO, VU.NOPESSOA, SUBSTR(VU.NOPESSOA,1,(INSTR(VU.NOPESSOA,' ')-1)) 
FROM V_USUARIO VU WHERE VU.NOPESSOA LIKE '% A %' OR VU.NOPESSOA LIKE '% B %' OR
                        VU.NOPESSOA LIKE '% C %' OR VU.NOPESSOA LIKE '% D %' OR
                        VU.NOPESSOA LIKE '% E %' OR VU.NOPESSOA LIKE '% F %' OR
                        VU.NOPESSOA LIKE '% G %' OR VU.NOPESSOA LIKE '% H %' OR
                        VU.NOPESSOA LIKE '% I %' OR VU.NOPESSOA LIKE '% J %' OR
                        VU.NOPESSOA LIKE '% K %' OR VU.NOPESSOA LIKE '% L %' OR
                        VU.NOPESSOA LIKE '% M %' OR VU.NOPESSOA LIKE '% N %' OR
                        VU.NOPESSOA LIKE '% O %' OR VU.NOPESSOA LIKE '% P %' OR
                        VU.NOPESSOA LIKE '% Q %' OR VU.NOPESSOA LIKE '% R %' OR
                        VU.NOPESSOA LIKE '% S %' OR VU.NOPESSOA LIKE '% T %' OR
                        VU.NOPESSOA LIKE '% U %' OR VU.NOPESSOA LIKE '% V %' OR
                        VU.NOPESSOA LIKE '% W %' OR VU.NOPESSOA LIKE '% X %' OR
                        VU.NOPESSOA LIKE '% Y %' OR VU.NOPESSOA LIKE '% Z %' OR
                        VU.NOPESSOA LIKE '% AP %' OR VU.NOPESSOA LIKE '%.%'
O seu exemplo funcionou, mas trouxe a tabela inteira + ou - 31 mil registros informando se tinha ou não '.'

Selecionar tudo

SELECT CASE 
         When INSTR(VU.NOPESSOA, '.') != 0 THEN 
           SUBSTR(VU.NOPESSOA, INSTR(VU.NOPESSOA, ' ', -1, 2)+1, INSTR(VU.NOPESSOA, '.')-INSTR(VU.NOPESSOA, ' ', -1, 2)+1) 
       ELSE 
           'Não possui nomes abreviados' 
       END ABREVIACAO 
FROM V_USUARIO VU
gfkauer
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 389
Registrado em: Ter, 27 Jul 2010 1:34 pm
Localização: Sapiranga - RS
Contato:
Quem falou que programar era fácil??

Quanto mais dificil for a implementação mais valorizado seu trabalho será!

Acessem: www.gfkauer.com.br

Considerando que todos os nomes abreviados possuem o "." você poderia tentar isto:

Selecionar tudo

  Select vu.nrregistro_usuario,
         vu.nopessoa,
         substr(vu.nopessoa, 1, (instr(vu.nopessoa, ' ') - 1)),
         substr(vu.nopessoa,
                instr(vu.nopessoa, ' ', -1, 2) + 1,
                instr(vu.nopessoa, '.') - instr(vu.nopessoa, ' ', -1, 2) + 1)
    From v_usuario vu
   Where instr(vu.nopessoa, '.') != 0

Não tenho certeza, mas pelo seu ultimo select isto deveria atender...
Avatar do usuário
vitellozzi
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 50
Registrado em: Qua, 15 Set 2010 9:53 am
Localização: Itatiba

Olá "gfkauer", Legal funcionou também no final percebi que não havia "."

Agradeço pela ajuda mas, ficou um curiosidade entre o comando INSTR e o comando LIKE, existe diferença ?

Selecionar tudo

SELECT DISTINCT VU.CDUSUARIO, VU.NOPESSOA, VU.CDAREAACAO, VU.NRCONTRATO, VU.NRFAMILIA, VU.TPUSUARIO, VU.NRDIGITOCT, VU.NRREGISTRO_USUARIO
       FROM USUARIO U, V_USUARIO VU
       WHERE U.NRREGISTRO_USUARIO = VU.NRREGISTRO_USUARIO
       AND (INSTR(VU.NOPESSOA, ' A ') != 0 OR INSTR(VU.NOPESSOA, ' B ') != 0 OR INSTR(VU.NOPESSOA, ' C ') != 0 OR
            INSTR(VU.NOPESSOA, ' D ') != 0 OR INSTR(VU.NOPESSOA, ' F ') != 0 OR -- REMOVIDO ' E '
            INSTR(VU.NOPESSOA, ' G ') != 0 OR INSTR(VU.NOPESSOA, ' H ') != 0 OR INSTR(VU.NOPESSOA, ' I ') != 0 OR
            INSTR(VU.NOPESSOA, ' J ') != 0 OR INSTR(VU.NOPESSOA, ' K ') != 0 OR INSTR(VU.NOPESSOA, ' L ') != 0 OR
            INSTR(VU.NOPESSOA, ' M ') != 0 OR INSTR(VU.NOPESSOA, ' N ') != 0 OR INSTR(VU.NOPESSOA, ' O ') != 0 OR
            INSTR(VU.NOPESSOA, ' P ') != 0 OR INSTR(VU.NOPESSOA, ' Q ') != 0 OR INSTR(VU.NOPESSOA, ' R ') != 0 OR
            INSTR(VU.NOPESSOA, ' S ') != 0 OR INSTR(VU.NOPESSOA, ' T ') != 0 OR INSTR(VU.NOPESSOA, ' U ') != 0 OR
            INSTR(VU.NOPESSOA, ' V ') != 0 OR INSTR(VU.NOPESSOA, ' W ') != 0 OR INSTR(VU.NOPESSOA, ' X ') != 0 OR
            INSTR(VU.NOPESSOA, ' Y ') != 0 OR INSTR(VU.NOPESSOA, ' Z ') != 0 OR 
            INSTR(VU.NOPESSOA, ' AP ') != 0) 
       AND U.DTINICIO BETWEEN '01/01/2010' AND '30/11/2010' AND U.DTEXCLUSAO IS NULL
[ ]'s
gfkauer
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 389
Registrado em: Ter, 27 Jul 2010 1:34 pm
Localização: Sapiranga - RS
Contato:
Quem falou que programar era fácil??

Quanto mais dificil for a implementação mais valorizado seu trabalho será!

Acessem: www.gfkauer.com.br

Existe sim.
São comandos bem diferentes. Com o like você busca um registro que contenha o seu parametro.
Já o instr você busca a posição do parametro.
Avatar do usuário
fsitja
Rank: OraSauro
Rank: OraSauro
Mensagens: 611
Registrado em: Seg, 19 Jan 2009 4:29 pm
Localização: Gaúcho no Rio de Janeiro - RJ
"The scars exist to remind us that the past was real"
Campanha: Como fazer uma pergunta e obter uma resposta.
http://tkyte.blogspot.com/2005/06/how-t ... tions.html

OCA & OCP Developer — OCE SQL Expert — OCS Data Warehousing Specialist

Expressões regulares são o atalho para resolver esse tipo de problema. É apenas uma questão de especificar as regras de forma detalhada e completa.

No exemplo abaixo coloquei que a regra da abreviação é que exista um espaço em branco seguido de 1 ou 2 letras, e essas letras são seguidas por algo que não seja letra (espaço ou ponto, por exemplo):

Selecionar tudo

select nome, regexp_substr(nome, '\s+[[:alpha:]]{1,2}[^[:alpha:]]') as nome_abrev
  from t_nome
 where regexp_like(nome, '\s+[[:alpha:]]{1,2}[^[:alpha:]]');
Exemplo da execução com um caso de teste:

Selecionar tudo

SQL> with t_nome as (
  2  select 'JOAO AP. DA S. FERREIRA' nome from dual union all
  3  select 'FRANCISCO AP. DA SILVA' from dual union all
  4  select 'FRANCISCO A. DA SILVA' from dual union all
  5  select 'MARIA DAS NEVES' nome from dual union all
  6  select 'VINICIUS DOS SANTOS' nome from dual union all
  7  select 'PEDRO COSTA E SILVA' nome from dual)
  8  -- fim dos dados de exemplo
  9  select nome, regexp_substr(nome, '\s+[[:alpha:]]{1,2}[^[:alpha:]]') as nome_abrev
 10    from t_nome
 11   where regexp_like(nome, '\s+[[:alpha:]]{1,2}[^[:alpha:]]');
 
NOME                    NOME_ABREV
----------------------- -----------------------
JOAO AP. DA S. FERREIRA  AP.
FRANCISCO AP. DA SILVA   AP.
FRANCISCO A. DA SILVA    A.
PEDRO COSTA E SILVA      E
Repare que "COSTA E SILVA" fica bem complicado de saber quando o "E" quer dizer um nome abreviado ou não... qual seria a regra nessas exceções?
Avatar do usuário
vitellozzi
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 50
Registrado em: Qua, 15 Set 2010 9:53 am
Localização: Itatiba

Olá " fsitja ", Boa Tarde.

Então ... tentei simular seu exemplo ... não consegui !!!
Vejamos tenho minha tabela : V_USUARIO com o campo nome : NOPESSOA

Ficaria assim :

Selecionar tudo

select VU.NOPESSOA, regexp_substr(VU.NOPESSOA, '\s+[[:alpha:]]{1,2}[^[:alpha:]]') as nome_abrev 
  from V_USUARIO VU 
 where regexp_like(VU.NOPESSOA, '\s+[[:alpha:]]{1,2}[^[:alpha:]]')
mas ocorreu erro : ORA-00920: operador relacional invalido
Avatar do usuário
fsitja
Rank: OraSauro
Rank: OraSauro
Mensagens: 611
Registrado em: Seg, 19 Jan 2009 4:29 pm
Localização: Gaúcho no Rio de Janeiro - RJ
"The scars exist to remind us that the past was real"
Campanha: Como fazer uma pergunta e obter uma resposta.
http://tkyte.blogspot.com/2005/06/how-t ... tions.html

OCA & OCP Developer — OCE SQL Expert — OCS Data Warehousing Specialist

Qual sua versão do Oracle?
Avatar do usuário
vitellozzi
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 50
Registrado em: Qua, 15 Set 2010 9:53 am
Localização: Itatiba

Olá, Boa Tarde.

A minha versão é Oracle 9i e estou utilizando o PL / SQL Developer vs. 8.0.2.1505. Esse comando só funciona no 10g ?

Sem mais
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 6 visitantes