[RESOLVIDO] Operador LIKE com vários testes no mesmo campo

Então pessoal, a ideia é fazer um aplicativo de Bolão. Já esta tudo funcionando. Mas agora preciso pesquisar os ganhadores com base nas 5 dezenas sorteadas. Tem como colocar as 5 dezenas utilizando o operador LIKE e OR?

BANCO FIREBIRD 2.5
CAMPO JOGO É UM VARCHAR

Qual banco de dados você está utilizando? O campo ‘jogo’ seria um varchar?

Firebird 2.5
varchar

Supondo que cada aposta tem 10 números e a pessoa precisa acertar 5 desses, você pode tentar algo como

select * from <TABELA> where 
(JOGO like '%PRIMEIRO_NUMERO_SORTEADO%') and
(JOGO like '%SEGUNDO_NUMERO_SORTEADO%') and
(JOGO like '%TERCEIRO_NUMERO_SORTEADO%') and
(JOGO like '%QUARTO_NUMERO_SORTEADO%') and
(JOGO like '%QUINTO_NUMERO_SORTEADO%');

Obs: fiz de cabeça, ajuste a sintaxe caso seja necessário.

Substitua <TABELA> pelo nome da sua tabela de jogo e PRIMEIRO_NUMERO_SORTEADO e afins pelos números sorteados. Isso deve retornar os jogadores que acertaram os 5 números sorteados.

PS: se for aumentar a complexidade desse aplicativo, considere usar tabelas separadas para os jogos, jogadores e números sorteados, fazendo as consultas através de joins. Isso te permitiria, por exemplo, saber que acertou os 5 números usando count(), por exemplo.

Abraço.

Com o jogo armazenado em um varchar o LIKE não vai resolver seu problema, porque ele vai retornar verdadeiro pra cada dezena sorteada que existir, sem contar quantas dezenas o apostador acertou.

Para este caso, te recomendo usar isso:

select nome, telefone, observacao, jogo
from apostas
where position('06', jogo) > 0
  and position('17', jogo) > 0
  and position('11', jogo) > 0
  and position('05', jogo) > 0
  and position('23', jogo) > 0

numa simulação em que as dezenas sorteadas foram 05, 06, 11, 17 e 23. O negócio aí é o seguinte: essa função retorna a posição em que o primeiro argumento(no caso a dezena sorteada) está dentro do segundo (o campo com a string do jogo). Se não encontra retorna zero.

1 curtida

Vendo a resposta do TerraSkilll retiro o que disse sobre o LIKE não resolver.

Interessante, não conhecia essa função position(). Bom que agora há mais opções :grin:

Abraços.

O chato é ela ser específica do firebird. Em outros bancos como Oracle por exemplo o mesmo resultado se obtém com a função INSTR()

Soluções interessantes… não conheço firebird, mas indo pelo SQL, eu já vi like sendo usado assim…

select * from tabela where campo like '%texto1%texto2%texto3%'

Tendo isso em mente, seria possível tentar algo assim?

select * from apostas where jogo like "%05%06%11%17%23%"

Isso pensando em performance obviamente, economizaria alguns likes…

1 curtida

Obrigado pelas sugestões! Obraço!

Poxa cara, indica pra nós qual foi a solução? Outras pessoas podem ter a mesma dúvida e estamos curiosos também…

Ao lado de cada post nosso tem um ícone de um tique (próximo ao coraçãozinho do gostei :joy:)

1 curtida

pode funcionar desse jeito que você propõe, desde que as dezenas estejam armazenadas em ordem no campo “jogo” e também na string que montar na consulta.

Ambos funcionam cara! :slight_smile:

1 curtida