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
  

Mensagemem Qua, 09 Jul 2008 4:15 pm

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...
joaozinhoadami
Localização: Uberlândia

Mensagemem Qua, 09 Jul 2008 5:25 pm

é 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:

Código: Selecionar todos
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
jessica.ff
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.

Mensagemem Qua, 09 Jul 2008 5:26 pm

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:
Código: Selecionar todos
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
dr_gori
Localização: Portland, OR USA

Thomas F. G

Mensagemem Qua, 09 Jul 2008 5:33 pm

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

Código: Selecionar todos
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


Código: Selecionar todos
      PRIMEIRO_NOME   SEGUNDO_NOME   TERCEIRO_NOME
1   JOSÉ                   GERA                    GERA
jessica.ff
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.

Mensagemem Qua, 09 Jul 2008 5:43 pm

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
joaozinhoadami
Localização: Uberlândia

Mensagemem Qua, 09 Jul 2008 5:50 pm

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
Código: Selecionar todos
      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
dr_gori
Localização: Portland, OR USA

Thomas F. G

Mensagemem Qua, 09 Jul 2008 5:53 pm

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 também 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
jessica.ff
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.

Mensagemem Qui, 10 Jul 2008 4:42 pm

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
joaozinhoadami
Localização: Uberlândia

Mensagemem Qui, 10 Jul 2008 7:04 pm

Veja se te ajuda...

Código: Selecionar todos
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;
joaogarcia
Localização: Campinas - SP

Cordialmente,
João C. Garcia

Mensagemem Sex, 11 Jul 2008 11:02 am

Obrigado a todos.

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

Abraços!
joaozinhoadami
Localização: Uberlândia

Mensagemem Seg, 14 Jul 2008 2:43 pm

Link interessante:

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

:-o
dr_gori
Localização: Portland, OR USA

Thomas F. G

Mensagemem Ter, 12 Mar 2019 9:48 am

Recuperando os nomes separadamente:

Código: Selecionar todos
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


Código: Selecionar todos
PRIMEIRO_NOME | SEGUNDO_NOME | TERCEIRO_NOME
JOSÉ          |GERALDO       | SILVA
bia3105
Localização: Belo Horizonte - MG


  • Veja também
    Respostas
    ExibiÇões
    Última mensagem