Buscar semelhante SQL Server
12/11/2014
0
Conseguiram entender?
Patricia
Posts
12/11/2014
Patricia
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?
12/11/2014
Soeuseijothaz
A aplicação esta sendo desenvolvida em qual plataforma?
12/11/2014
Patricia
13/11/2014
Soeuseijothaz
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.
13/11/2014
Marisiana Battistella
Existe alguma condição a ser atendida?
13/11/2014
Marisiana Battistella
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;
13/11/2014
Patricia
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.
14/11/2014
Marisiana Battistella
Que bom que conseguistes encontrar uma solução e obrigada por compartilhar ela conosco!
Clique aqui para fazer login e interagir na Comunidade :)