SUBSTR NEGATIVO

Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
dudu0566
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 74
Registrado em: Seg, 06 Ago 2007 3:59 pm
Localização: Campinas - SP

Galera dei uma procurada nos posts mas não encontrei a resposta para meu problema.

É o seguinte, tenho um campo (string) e gostaria de a partir do final dele encontrar um caracter e retornar tudo que viesse depois dele.
O problema que esse caracter pode repetir dentro do campo, e eu necessito que seja o primeiro a partir do final.
Ex.

Selecionar tudo

'1234X47545445X411245X1474125X2546'
O caracter é o 'X', então deveria retornar '2546'.
Estou tentando usar o substr, mas como as posições dos caracteres são variáveis não estou conseguindo.....

Alguém poderia me ajudar????
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

Acompanhe a linha de raciocínio:

1. Vamos criar uma variavel "V" no sql*plus:

Selecionar tudo

SQL> var v varchar2(200);
2. Setamos o valor que você quer nela:

Selecionar tudo

SQL> begin
  2    :v := '1234X47545445X411245X1474125X2546';
  3  end;
  4  /

PL/SQL procedure successfully completed.

SQL> print

V
---------------------------------------------------------
1234X47545445X411245X1474125X2546

SQL> 

3. O Instr procura numa string uma outra (no caso, o X), e retorna a posição encontrada:

Selecionar tudo

SQL> select instr( :v , 'X' ) from dual;

INSTR(:V,'X')
-------------
            5
4. Dá pra forçar ele a buscar A PARTIR de uma determinada posição! (no caso abaixo, a partir da 6 posição)

Selecionar tudo

SQL> select instr( :v , 'X', 6 ) from dual;

INSTR(:V,'X',6)
---------------
             14
5. Pra terminar, ele busca de tras pra frente, mas daí tem que botar negativo!

Selecionar tudo

SQL> select instr( :v, 'X', -1 ) from dual;

INSTR(:V,'X',-1)
----------------
              29
6. Com base nisso, fazemos o substr a partir dessa posição:

Selecionar tudo

SQL> select substr( :v, INSTR(:V,'X',-1) ) from dual;

SUBSTR(:V,INSTR(:V,'X',-1))
---------------------------------------------------------
X2546

SQL> select substr( :v, INSTR(:V,'X',-1)+1  ) from dual;

SUBSTR(:V,INSTR(:V,'X',-1)+1)
---------------------------------------------------------
2546

SQL> 
OUTRAS REFERENCIAS:
http://glufke.net/oracle/viewtopic.php?t=753
http://glufke.net/oracle/viewtopic.php?t=3301

:-o
dudu0566
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 74
Registrado em: Seg, 06 Ago 2007 3:59 pm
Localização: Campinas - SP

valeu..... deu certo....

Abraço
Responder
  • Informação
  • Quem está online

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