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ódigo

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; 

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ódigo

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.

Marisiana
   - 14 nov 2014

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