Array
(
)

Buscar semelhante SQL Server

Patricia
   - 12 nov 2014

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?

Mariana Carvalho
   - 12 nov 2014

Não entendi bem.

Patricia
   - 12 nov 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?

Jothaz
   - 12 nov 2014

Seria um número ou conjunto de números?

A aplicação esta sendo desenvolvida em qual plataforma?

Patricia
   - 12 nov 2014

Preciso apenas do select, sem nenhuma aplicação. Preciso achar um número apenas

Jothaz
   - 13 nov 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:

#Código

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.

Marisiana
   - 13 nov 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?

Marisiana
   - 13 nov 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.

#CódigoCREATE 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;

Patricia
   - 13 nov 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:

#Códigoif 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.

Marisiana
   - 14 nov 2014

Por nada Patricia!
Que bom que conseguistes encontrar uma solução e obrigada por compartilhar ela conosco!