2016-04-12 18 views
2

Tamam crappy başlık, ancak satırlar arasında koşullar arasında bir tablo var.SQL, satır değerlerini temel alan koşullar arasında geçiş yapmak için <a0></ a0>

id | Value | ValueMax 
1  0  49000 
2 50000  70000 

Kolay kısım, bir değeri karşılaştırıp satırlardan birini döndürmektir. Kırılan kısım, eğer ValueMax'ı aşarsa, bu durumda 70000'ün bu sıraya dönmesidir. Ancak x> ValueMax basit durumu diğer satırı da karşılar ve her ikisi de iade edilir. Neyi kaçırıyorum.

+0

Hangi veritabanını kullanıyorsunuz? –

+0

SQL Server 2008. – nportelli

cevap

0

bu deneyin:

SELECT Id, Value, ValueMax 
FROM mytable 
WHERE @x BETWEEN Value AND ValueMax 

UNION 

SELECT Id, Value, ValueMax 
FROM mytable 
WHERE ValueMax = (SELECT MAX(ValueMax) FROM mytable) AND 
     NOT EXISTS (SELECT 1 
        FROM mytable 
        WHERE @x BETWEEN Value AND ValueMax) 
2

ValueMax yok sayıp sadece ValueMin kullanın. ANSI SQL:

select t.* 
from t 
where @x >= ValueMin 
order by ValueMin desc 
fetch first 1 row only; 

Farklı veritabanları "sadece ilk 1 satır getirme" yazım farklı yolları var; Bazıları limit, bazılarını top kullanın, bazılarını rownum kullanın ve hatta bu ANSI sözdizimini destekleyin. ValueMax sonraki Kaydın değeri eksi 1. Bir sorguda ValueMax hesaplayabilirdi hep olduğu gibi

+1

"Sıralama", "desc" mi? –

0

Sen artık olarak verileri depolamak gibidir:

select 
    value, 
    lead(value) over (order by value) - 1 as valuemax 
from mytable; 

Bu bile şimdilik bir null alır son kayıt düzeltir "sınırsız" bazı yanlış numara yerine (örneğinizde 70000).

Bu sorgu değeri size doğru kayıt almaktadır buna göre @x: Eğer tablodan ValueMax kaldırabilir

select value, valuemax 
from 
(
    select 
    value, 
    lead(value) over (order by value) - 1 as valuemax 
    from mytable 
) values 
where @x between value and coalesce(valuemax, @x); 

. Gösterildiği gibi gereksizdir ve bu nedenle gerekli değildir.

Bu sütunu kolaylık sağlamak istiyorsanız, son değeri null olarak ayarlamalısınız (göz ardı edilmesi gerektiğinde neden 70000)? Bu sorguyu basitleştirir:

select value, valuemax 
from mytable 
where @x between value and coalesce(valuemax, @x); 
İlgili konular