Localizar numero em string

Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
jks1903
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 188
Registrado em: Qui, 04 Fev 2010 8:08 am

Pessoal é o seguinte.

Tenho u mcampo em uma tabela que é do tipo vachar.

É um campo para observações, porém estamos utilizando o mesmo com o intuito de relacionar códigos com um outro sistema.

Nesse campo observação pode haver o seguinte:

1-33-566-23-230

Onde cada numero é um codigo. Queria ver se alguém possui uma função ou script pronto que localize dentro desse campo um determinado numero.

Por exemplo: Se eu pesquisar a observação com o codigo 23, ele busca a linha onde um dos codigos relacionados é o 23.

To quebrando a cabeça e não estou achando um meio de fazer isso.
Tentei com %23% por exemplo, mas ai ele me retorna o 233 também.

alguém tem uma ideia de como posso buscar isso?
diegopedrao
Rank: Analista Sênior
Rank: Analista Sênior
Mensagens: 164
Registrado em: Sex, 22 Ago 2008 12:28 pm
Localização: SP

cara v c é isso:

Selecionar tudo

select SUBSTR('34983024230892389809808',INSTR('34983024230892389809808', '23') , LENGTH('23')) from dual
Att,

Diego Monteiro
jks1903
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 188
Registrado em: Qui, 04 Fev 2010 8:08 am

Cara, talvez seja, mas só com esse exemplo não sei dizer.

Me mostra um exemplo na swguinte estrutura então, ai posso ver.

Digamos que eu tenha a tabela x

Nessa tabela x eu tenho o campo cod e cod_relac

cod é uma sequence (1,2,3,4...)

Já cod_relac é o campo varchar onde podem existir a string (1-2-33-22-45)

Digamos que eu queira localizar a linha onde no campo cod_relac possua o numero 33.

Como seria o select?

Vlw
victorhugomuniz
Moderador
Moderador
Mensagens: 1396
Registrado em: Sex, 01 Fev 2008 2:06 pm
Localização: Rio de Janeiro - RJ
Contato:
:D

você não pode fazer isso?

Selecionar tudo

select * from x where cod_relac like '%-33-%';
diegopedrao
Rank: Analista Sênior
Rank: Analista Sênior
Mensagens: 164
Registrado em: Sex, 22 Ago 2008 12:28 pm
Localização: SP

Vê isso aqui então mais fácil.

Selecionar tudo


SELECT CAMPO
  FROM (select '33-2-1-22-23' as campo from dual)
 WHERE CAMPO LIKE '%-33-%'
    OR CAMPO LIKE '%-33'
    OR CAMPO LIKE '33-%'
Att,

Diego Monteiro
jks1903
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 188
Registrado em: Qui, 04 Fev 2010 8:08 am

cara, hahahaha

Meu problema deve ser sono, to em epoca de provas e trabalhos na faculdade e mais o trab aqui que está puxado, não sei porque não consegui pensar nisso, rsrs.

Realmente muito simples, vlw velho...
Marcelo Malta
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 9
Registrado em: Ter, 28 Set 2010 3:23 pm
Localização: Serra-ES
Atc,
----------------------------------------
Marcelo Malta
Analista de Sistemas
----------------------------------------

A solução é simples sim, mas não vejo muita diferença entre isso e

Selecionar tudo

like '%33%'
se tiver algum código '1-29-18-333-182-91' vai trazer também, e acho que não é isso que você quer, ele pega pela '%-33%'

Eu teria que pesquisar para te dar uma resposta correta, mas existe uma função que separa os valores por um determinado caracter, no caso o '-', tipo o Split no C# e traz uma lista de valores. Não lembro ao certo como é no Oracle, mas acho que isso te atenderia melhor.

Se alguém souber do que eu estou falando poderia ajudar também.
jks1903
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 188
Registrado em: Qui, 04 Fev 2010 8:08 am

Cara, na verdade daquela forma ali não pegará um possível -333- porque o like sempre possui o traço.

Ou é %-33-% que buscara o 33 no meio da string
ou '33-% que buscará no início da mesma
ou por fim o %-33' que encontrará caso o 33 esteja ao fim.

Por ter sempre o traço junto ao 33, não há perigo de buscar um 333.

Mas vlw pela resposta.

:-o
victorhugomuniz
Moderador
Moderador
Mensagens: 1396
Registrado em: Sex, 01 Fev 2008 2:06 pm
Localização: Rio de Janeiro - RJ
Contato:
:D

eu acho q não existe essa função não.. tem q criar ela

http://www.orafaq.com/forum/t/11692/0/
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

Que tal isto:

Selecionar tudo

Select g.*
  From gfk_teste g
 Where g.valor Like '%&p_busca%'
   And ((instr(g.valor, &p_busca) + length(&p_busca)-1) = length(g.valor)
     Or substr(g.valor, instr(g.valor, &p_busca) + length(&p_busca), 1) = &separador);
burga
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Qui, 26 Nov 2009 1:05 pm
Localização: SP

O problema do codigo do diego é se existir somente o numero 33 no campo (sem traços antes nem depois), ele não será retornado.

Acho que a solução mais simples é usar expressões regulares:

Selecionar tudo

select * from tabela
where regexp_like(coluna, '(^|-)33($|-)');
Marcelo Malta
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 9
Registrado em: Ter, 28 Set 2010 3:23 pm
Localização: Serra-ES
Atc,
----------------------------------------
Marcelo Malta
Analista de Sistemas
----------------------------------------

Realmente eu comi mosca. A sua solução atende bem mesmo, com exceção ao caso de somente ter o número 33 no campo.

Entretanto já colocaram solução para isso.
jks1903
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 188
Registrado em: Qui, 04 Fev 2010 8:08 am

O problema do codigo do diego é se existir somente o numero 33 no campo (sem traços antes nem depois), ele não será retornado.

Acho que a solução mais simples é usar expressões regulares:
Opa não havia mais voltado ao tópico por já ter solucionado o problema.
Mas realmente se for somente o 33 aquele código não buscava.

Mas aí eu simplesmente adicionei mais um OR

Selecionar tudo

...
OR campo LIKE '33'
E funcionou blza, criei uma função retornando o código desse select e consegui resolver o problema.

Obrigado a todos pela ajuda.

Vlw.
Responder
  • Informação