Buscar semelhante SQL Server
Gente, preciso realizar uma busca e não sei nem por onde começar. Se trata de um sorteio, tenho o número (inserido em uma coluna varchar) e gostaria de busca-lo na minha tabela, até aí blz, porém se não achar o resultado, ele tem que buscar o próximo número que seja maior. Se não tiver número maior ele tem que buscar o primeiro que seja menor referente ao sorteado.
Conseguiram entender?
Conseguiram entender?
Patricia
Curtidas 0
Respostas
Mariana Carvalho
12/11/2014
Não entendi bem.
GOSTEI 0
Patricia
12/11/2014
Vamos pensar num jogo da mega sena, tiveram os números sorteados, com esse número eu preciso varrer minha tabela procurando o ganhador. Até aí blz.
Mas se não tiver ganhador com esse número, eu preciso identificar o ganhador com o número acima, até achar alguém.
Se não tiver número acima, preciso procurar número abaixo.
Conseguiu entender?
Mas se não tiver ganhador com esse número, eu preciso identificar o ganhador com o número acima, até achar alguém.
Se não tiver número acima, preciso procurar número abaixo.
Conseguiu entender?
GOSTEI 0
Soeuseijothaz
12/11/2014
Seria um número ou conjunto de números?
A aplicação esta sendo desenvolvida em qual plataforma?
A aplicação esta sendo desenvolvida em qual plataforma?
GOSTEI 0
Patricia
12/11/2014
Preciso apenas do select, sem nenhuma aplicação. Preciso achar um número apenas
GOSTEI 0
Soeuseijothaz
12/11/2014
Patricia,
Talvez eu não seja a pessoa mais indicada para lhe ajudar, porque não sou expert em SQL.
Contudo fiquei intrigado com o problema proposto pelo post.
Quebrei a cabeça e não consegui escrever uma expressão select única que solucione o problema.
Entranto usando if´s consegui chegar no script abaixo:
Sei que ficou horroroso e uma baita gambiarra, mas acho que pode inspirá-la de como pode ser feito.
Aqui no fórum tem muita gente fera em SQL que realmente sabe e não apenas curioso como eu.
Vamos aguardar alguém se manifestar
Fui só uma elucubração e se não ajudar favor desconsiderá-la.
No mais boa sorte.
Talvez eu não seja a pessoa mais indicada para lhe ajudar, porque não sou expert em SQL.
Contudo fiquei intrigado com o problema proposto pelo post.
Quebrei a cabeça e não consegui escrever uma expressão select única que solucione o problema.
Entranto usando if´s consegui chegar no script abaixo:
declare @teste table (numero int) insert into @teste (numero) values (60) insert into @teste (numero) values (10) insert into @teste (numero) values (50) insert into @teste (numero) values (8) insert into @teste (numero) values (5) insert into @teste (numero) values (15) insert into @teste (numero) values (25) declare @filtro int select @filtro = 16 -->>>>>>>>>> ATENÇÂO <<<<<<<<<<<<< INFORMA VALOR A SER PESQUISADO AQUI declare @achou_filtro int declare @achou_filtro_maior int declare @achou_filtro_menor int declare @min_valor_bd int declare @max_valor_bd int select @min_valor_bd = (select top(1) numero from @teste order by numero asc) select @max_valor_bd = (select top(1) numero from @teste order by numero desc) select @achou_filtro = (select numero from @teste where numero = @filtro) select @achou_filtro_menor = (select top (1) numero from @teste where numero < @filtro order by numero desc) select @achou_filtro_maior = (select top (1) numero from @teste where numero > @filtro order by numero asc) select 'achou filtro' = @achou_filtro,'achou_maior' = @achou_filtro_maior, 'achou_menor' = @achou_filtro_menor, 'min_valor_bd' = @min_valor_bd, 'max_valor_bd' = @max_valor_bd if (@filtro < @min_valor_bd) begin print '@filtr é menor que @min_valor_bd' select 'Resultado' = @min_valor_bd end else if (@filtro > @max_valor_bd) begin print '@filtro é maior que @max_valor_bd' select 'Resultado' = @max_valor_bd end else if (@achou_filtro is null) begin print '@filtro não existe na tabela' if (@achou_filtro_maior is null) begin print '@filtro não existe na tabela e não existe valor acima - retorna menor' select 'Resultado' = @achou_filtro_menor end else begin print '@filtro não existe na tabela - retorna maior' select 'Resultado' = @achou_filtro_maior end end else begin print '@filtro existe na tabela' select 'Resultado' = @achou_filtro end
Sei que ficou horroroso e uma baita gambiarra, mas acho que pode inspirá-la de como pode ser feito.
Aqui no fórum tem muita gente fera em SQL que realmente sabe e não apenas curioso como eu.
Vamos aguardar alguém se manifestar
Fui só uma elucubração e se não ajudar favor desconsiderá-la.
No mais boa sorte.
GOSTEI 0
Marisiana Battistella
12/11/2014
Patricia, quais são os critérios para ele identificar o número acima e quais os critérios pra ele identificar o número abaixo?
Existe alguma condição a ser atendida?
Existe alguma condição a ser atendida?
GOSTEI 0
Marisiana Battistella
12/11/2014
Sugiro que seja criado um procedimento que receba o número sorteado como parâmetro e tenha um retorno que atenda a regra que deve ser atendida.
Criei uma estrutura para exemplificar a minha sugestão e facilitar o entendimento da lógica.
A sintaxe do SQLServer não deve ser igual a que utilizei no exemplo, então será necessário adaptar a estrutura de acordo com a linguagem.
Criei uma estrutura para exemplificar a minha sugestão e facilitar o entendimento da lógica.
A sintaxe do SQLServer não deve ser igual a que utilizei no exemplo, então será necessário adaptar a estrutura de acordo com a linguagem.
CREATE OR REPLACE PROCEDURE prc_sorteio (in_numero IN NUMERIC, out_retorno OUT NUMERIC) IS v_numero NUMERIC; BEGIN SELECT numero INTO v_numero FROM tabela WHERE numero = in_numero; IF v_numero IS NULL THEN --- se não encontrou o sorteado vai buscar o número acima SELECT numero INTO v_numero FROM tabela WHERE numero = in_numero; IF v_numero IS NULL THEN --- não encontrou o número acima então vai buscar um número abaixo SELECT numero INTO v_numero FROM tabela WHERE numero = in_numero; IF v_numero IS NULL THEN --- não encontrou número abaixo então deve ser definido um retorno do procedimento para esta condição. --- pode retornar uma mensagem informando ELSE --- encontrou o número abaixo, então vai pesquisar as informações que precisam ser retornadas no procedimento. SELECT numero FROM tabela WHERE numero = v_numero; ELSE --- encontrou o número a cima então vai pesquisar as informações que precisam ser retornadas no procedimento. SELECT numero FROM tabela WHERE numero = v_numero; END IF; ELSE --- encontrou o número sorteado então vai buscar as informações que precisam ser retornadas SELECT numero FROM tabela WHERE numero = v_numero; END IF; END;
GOSTEI 0
Patricia
12/11/2014
Oi gente.
Gostaria de agradecer muito a ajuda, fiquei quebrando a cabeça tentando fazer algo simples e fiz através de uma query mesmo, ficando assim:
Gostaria de agradecer muito a ajuda, fiquei quebrando a cabeça tentando fazer algo simples e fiz através de uma query mesmo, ficando assim:
if exists (select id_cpf, cartao_4ult, cupom from Cupons_teste_Paty where cupom >= 553415465) --order by CAST(cupom as numeric)) -- Se ele achar o número ou um maior ele irá trazer para mim, só quero um resultado, por isso usei o TOP(1) select top (1) id_cpf, cartao_4ult, cupom from Cupons_teste_Paty where cupom >= 553415465 order by CAST(cupom as numeric) else select top (1) id_cpf, cartao_4ult, cupom from Cupons_teste_Paty where cupom < 553415465 order by CAST(cupom as numeric) -- Se ele não achar ele vai me trazer o número abaixo.
GOSTEI 0
Marisiana Battistella
12/11/2014
Por nada Patricia!
Que bom que conseguistes encontrar uma solução e obrigada por compartilhar ela conosco!
Que bom que conseguistes encontrar uma solução e obrigada por compartilhar ela conosco!
GOSTEI 0