Função de String

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
joaozinhoadami
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 6
Registrado em: Ter, 24 Jun 2008 9:32 am
Localização: Uberlândia

Boa tarde pessoal,

estou com uma dúvida e gostaria de saber se alguém pode me ajudar, é o seguinte:

tenho em uma tabela uma coluna "NOME", onde se cadastra por exemplo "José Geraldo Silva".

Eu preciso transformar estes dados para uma nova tabela onde "José Geraldo Silva" deve constar em tres colunas diferentes, sendo elas "FIRST_NAME - José", "LAST_NAME - Silva", "MIDDLE_NAME - Geraldo" e não mais apenas na coluna "NOME - José Geraldo Silva".


grato...
Avatar do usuário
jessica.ff
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 61
Registrado em: Seg, 11 Jun 2007 2:28 pm
Localização: Gravataí - RS
ninguém é tão sabio que não tenha a aprender, e nem tão ignorante que não tenha a ensinar.

é garantido que sempre terá no minimo 3 nomes ou que não estejam abreviados?


Pois você pode utilizar o substr e instr para pegar cada parte do nome por exemplo:

Selecionar tudo

select substr('JOSÉ GERALDO SILVA',1,instr('JOSÉ GERALDO SILVA',' ')-1)
from dual

select substr('JOSÉ GERALDO SILVA', instr('JOSÉ GERALDO SILVA', ' ') + 1, instr(substr('JOSÉ GERALDO SILVA', instr('JOSÉ GERALDO SILVA', ' ') + 1, length('JOSÉ GERALDO SILVA')), ' ') - 1)
from dual
E depois você pega o final, mas o esquema é o mesmo!!!
A partir disso você consegue fazer verificação pra mais ou menos nomes
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Pode usar a função SUBSTR pra pegar apenas um pedaço da string. E a função INSTR pra achar exatamente a posição do espaço em branco.

Algo assim:

Selecionar tudo

SELECT 
  SUBSTR( campo, 1, INSTR(campo,' ')-1 )  primeiro_nome
, SUBSTR( campo, INSTR(campo, ' '), INSTR(campo, ' ',2)  segundo_nome 
, SUBSTR( campo, INSTR(campo, ' ',2), INSTR(campo, ' ',3)  terceiro_nome
FROM ...
Eu não testei, mas é usando esses comandos que você chega lá :-D
Avatar do usuário
jessica.ff
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 61
Registrado em: Seg, 11 Jun 2007 2:28 pm
Localização: Gravataí - RS
ninguém é tão sabio que não tenha a aprender, e nem tão ignorante que não tenha a ensinar.

Oi Thomas
Isso não funciona fui testar porque pensei, bah que topeira que eu sou ta bem mais simples que o meu, porem ele retorna o seguinte

Selecionar tudo

select SUBSTR( 'JOSÉ GERALDO SILVA', 1, INSTR('JOSÉ GERALDO SILVA',' ')-1 ) as primeiro_nome 
, SUBSTR( 'JOSÉ GERALDO SILVA', INSTR('JOSÉ GERALDO SILVA', ' '), INSTR('JOSÉ GERALDO SILVA', ' ',2))  as segundo_nome 
, SUBSTR( 'JOSÉ GERALDO SILVA', INSTR('JOSÉ GERALDO SILVA', ' ',2), INSTR('JOSÉ GERALDO SILVA', ' ',3)) as terceiro_nome 
from dual

Selecionar tudo

   	PRIMEIRO_NOME	SEGUNDO_NOME	TERCEIRO_NOME
1	JOSÉ	                GERA	                 GERA
joaozinhoadami
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 6
Registrado em: Ter, 24 Jun 2008 9:32 am
Localização: Uberlândia

ola, você perguntou se sempre será no mínimo 3 nomes ou que não estejam abreviados.

A resposta é não, infelizmente não existe regra para estes nomes, eles podem estar nas mais variadas formas, isso inclui abreviações.


Desde já agradeço

se puderem continuar a me ajudar

obrigado
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

jessica.ff escreveu:Oi Thomas
Isso não funciona fui testar porque pensei, bah que topeira que eu sou está bem mais simples que o meu, porem ele retorna o seguinte

Selecionar tudo

   	PRIMEIRO_NOME	SEGUNDO_NOME	TERCEIRO_NOME
1	JOSÉ	                GERA	                 GERA

Oi Jessica, claro! Meu SQL está errado! (fiz ele de cabeça e fiz errado). To sem ORACLE aqui pra testar, mas depois eu arrumo e posto aqui.

Aproveito pra deixar 2 links de coisas que podem ajudar:

Tokenizer:
http://glufke.net/oracle/viewtopic.php?t=753

Neste link tem a função ELEMENTO, que é exatamente o que você precisa:
(é o sétimo post do tópico)
http://glufke.net/oracle/viewtopic.php?t=1653

:-o
Avatar do usuário
jessica.ff
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 61
Registrado em: Seg, 11 Jun 2007 2:28 pm
Localização: Gravataí - RS
ninguém é tão sabio que não tenha a aprender, e nem tão ignorante que não tenha a ensinar.

Então te aconselho primeiro a contar a qtde de espaços que tem isso vai te definir a qtde de nomes, por exemplo 2 espaços 3nomes. Porem José da Silva, ele vai considerar o da tb como um nome.

Uma forma pra você solucionar isso é pegar o primeiro nome, pegar o ultimo nome, e todo o resto é inserido no nome do meio


Espero ter ajudado
joaozinhoadami
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 6
Registrado em: Ter, 24 Jun 2008 9:32 am
Localização: Uberlândia

desculpe jessica, mas tentei por aqui e não obtive muito sucesso, é que estou começando com pl/sql, se você puder continuar me ajudando fico grato.

um abraço

obrigado
joaogarcia
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 91
Registrado em: Ter, 20 Mar 2007 7:19 pm
Localização: Campinas - SP
Contato:
Cordialmente,
João C. Garcia

Veja se te ajuda...

Selecionar tudo

DECLARE
  VNOME VARCHAR2(50):='FILISBINO SICRANO MARCULINO';
  VPOS  NUMBER :=0;
BEGIN
  --
  FOR I IN 1.. LENGTH(VNOME) LOOP
    IF SUBSTR(VNOME,I,1) = ' ' THEN
      VPOS := I;
    END IF;
  END LOOP;  
  --
  DBMS_OUTPUT.put_line( 'FIRST_NAME: '||SUBSTR(VNOME,1,INSTR(VNOME,' ')-1) );
  DBMS_OUTPUT.put_line( 'MIDLE_NAME: '||SUBSTR(VNOME,INSTR(VNOME,' ')+1, VPOS-INSTR(VNOME,' ')-1) );
  DBMS_OUTPUT.put_line( 'LAST_NAME: ' ||SUBSTR(VNOME,VPOS+1) );
  --
END;
joaozinhoadami
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 6
Registrado em: Ter, 24 Jun 2008 9:32 am
Localização: Uberlândia

Obrigado a todos.

Resolvi o meu problema utilizando o código do joaogarcia.
Valeu pela força.

Abraços!
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Link interessante:

Função que abrevia o nome p/ caber em X caracteres.
http://glufke.net/oracle/viewtopic.php?t=3341

:-o
bia3105
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 3
Registrado em: Qui, 26 Ago 2010 3:43 pm
Localização: Belo Horizonte - MG

Recuperando os nomes separadamente:

Selecionar tudo

select SUBSTR( 'JOSÉ GERALDO SILVA', 1, INSTR( 'JOSÉ GERALDO SILVA',' ')-1 ) as primeiro_nome  
     , substr( 'JOSÉ GERALDO SILVA', instr( 'JOSÉ GERALDO SILVA', ' ') + 1, instr(substr( 'JOSÉ GERALDO SILVA', instr( 'JOSÉ GERALDO SILVA', ' ') + 1, length( 'JOSÉ GERALDO SILVA')), ' ') - 1)  as segundo_nome 
     , substr( 'JOSÉ GERALDO SILVA', INSTR( 'JOSÉ GERALDO SILVA', ' ', -1)) as terceiro_nome 
from dual

Selecionar tudo

PRIMEIRO_NOME | SEGUNDO_NOME | TERCEIRO_NOME
JOSÉ          |GERALDO       | SILVA
Responder
  • Informação
  • Quem está online

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