Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

rafael_nikit

Select em dados com delimitador

Recommended Posts

Boa tarde Amigos do Imasters,

 

estou o dia inteiro travado em um simples select no MySQL.

 

Preciso de um select que pegue um valor específico (exemplo "2"), onde o campo possui um valor parecido com este "1, 2, 55, 3, 4".

 

Tentei desta forma:

select * from TABELA where COLUNA like 2 or COLUNA like '2,%' or COLUNA like '%2' 

 

Em alguns testes deu certo, mas depois verifiquei que algumas linhas não eram resgatadas.

 

Abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tentei a funções FIND_IN_SET, SUBSTRING E SUBSTRING_INDEX, mas também não deu certo.

 

Vou parar um pouco senão minha cabeça vai explodir rsrs..

 

Daqui a pouco tento volto para o PC.

 

Se alguém souber como fazer esta consulta.

 

Muito obrigado!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Creio que bastaria Like '%2%'

 

Desta forma eu tenho problemas quando tenho um valor "23, 5, 3, 12", pois ele vai encontrar o número 2 quando for 20, 21, 22...

Esta é minha grande dificuldade, preciso do número exato em cada delimitador.

 

Na programação eu trataria com um split e um comparador, mas no SQL não consigo de jeito nenhum.

 

 

select * from TABELA where COLUNA like 2 or COLUNA
 like '2,%' or COLUNA like '%,2'  or COLUNA LIKE '%,2,%'

 

Já havia tentado assim e tbm não deu certo.

 

ID Valor

1 1, 2

2 1

3 1, 2, 3

4 2

 

O retorno é apenas dos IDs 1 e 4, quando deveria ser 1, 3 e 4.

Compartilhar este post


Link para o post
Compartilhar em outros sites

ID Valor

1 1, 2

2 1

3 1, 2, 3

4 2

 

O retorno é apenas dos IDs 1 e 4, quando deveria ser 1, 3 e 4.

 

Ele nao devia retornar o 4, n seria 1 e 3? se o problema for o 4 entao basta por um =2 la na tabela

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ele nao devia retornar o 4, n seria 1 e 3? se o problema for o 4 entao basta por um =2 la na tabela

 

Alterei tudo para =, mas só retornou o ID 1, Coloquei tudo like e retorna os 3 itens (na primeira comparação estava = e não like ).

 

Aparentemente td ok, mas quando eu simulo o valor "23" ele reconhece que tem o 2 e me retorna errado. Vou tentar a sugestão do Motta se eu não conseguir vou tratar na programação mesmo.

 

De qualquer forma eu agradeço a ajuda de todos, conseguindo ou não eu informo.

 

Abraços

 

Desta forma eu tenho problemas quando tenho um valor "23, 5, 3, 12", pois ele vai encontrar o número 2 quando for 20, 21, 22...

Esta é minha grande dificuldade, preciso do número exato em cada delimitador.

 

Na programação eu trataria com um split e um comparador, mas no SQL não consigo de jeito nenhum.

 

 

Já havia tentado assim e tbm não deu certo.

 

ID Valor

1 1, 2

2 1

3 1, 2, 3

4 2

 

O retorno é apenas dos IDs 1 e 4, quando deveria ser 1, 3 e 4.

 

Realmente este parece ser o caminho, cheguei muito perto, mas ainda não consegui escrever de modo que pegue o valor exato.

 

A programação e modelagem está toda pronta e o problema é que são 5 colunas neste formato.

 

Já sei como resolver na programação, mas queria resolver no MySQL.

 

O mais próximo foi este "REGEXP '^[0-9] | 2|2|2 '"

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se dá trabalho para fazer uma coisa simples o melhor é normalizar a tabela.

 

Outra solução seria fazer uma function que tratasse isto, ou seja "destrinchar" a string.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se dá trabalho para fazer uma coisa simples o melhor é normalizar a tabela. Outra solução seria fazer uma function que tratasse isto, ou seja "destrinchar" a string.

 

Queria fazer tudo via SQL, mas vou fazer uns splits na programação que vai resolver.

Realmente pensei que fosse mais simples pegar um termo exato dentro de um campo com delimitadores.

 

De qqr forma obrigado a todos.

 

Abs

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pessoal acho que consegui resolver.

 

Fiz diversos testes e não encontrei bugs.

 

Segue a tabela e resultado com explicações:

 

ID Valor

1 1, 2

2 1

3 1, 2, 3

4 23

5 2

 

SQL = REGEXP '^[0-9] | 2|2$

 

resultado IDs = 1, 3 e 5

 

^ = Busca no início da String

[0-9] = Caracteres numéricos

| define onde inicia o valor desejado, no meu caso " 2" e "2" (notem o espaço)

$ = termina com determinado valor

 

O grande X da questão foi o 2$, pois assim valores como 23. 209, 102 não retornam em minha busca.

 

Se eu falei algo errado ou alguém encontrar bugs me corrija, pois não sou especialista sm MySQL.

 

Abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

Testou com 12,32 etc ?

 

Testei mas com espaço após o delimitador funcionou normal.

Em meu caso sempre haverá um espaço " " depois do delimitador ",".

 

Encontrei um Bug nas consultas que o valor vinha primeiro. Segue abaixo a explicação a correção.

 

'^[0-9] | 2|2$|2,'

 

Acrescentei apenas "|2,".

 

Obs.: um espaço errado buga tudo, então se alguém aqui utilizar esta string muita atenção.

 

Abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olha eu aqui novamente!

 

Meu post anterior apresenta alguns Bugs.

 

Segue a expressão mais simples e sem bugs:

 

^[0-9] |^1$|^20$

 

^ = inicia com

$ = Termina com

 

sendo assim ^1$

Inicia com 1 e termina com 1. Simples assim rsrs

 

Abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.