2017-06-02 2 views
0

Ich möchte die item_id von der Zeile am nächsten über oder am nächsten unten erhalten. Zum Beispiel:Returning nearest rows Taste nach oben oder unten

enter image description here

Also, wenn ich möchte, dass die die Zeile unten, würde ich Eingang 3 und 1 würde zurückgegeben. Wenn ich über 3 wollte, würde ich eingeben und 4 würde zurückgegeben werden.

so etwas wie: exec [myFunction] 3, 'up';

Ich war auf der Suche in die nächste relative Zahl bekommen (https://dba.stackexchange.com/questions/73804/how-to-retrieve-closest-value-based-on-look-up-table). Aber das Problem ist, dass es die nächste Nummer zurückgibt. Wenn ich 3 eingegeben habe, aber die nächste Nummer 7 war, fügte ich eine hinzu, um 4 zu machen, und das würde 3 wieder ergeben. Ich hoffe das ergibt Sinn.

Dann schaute ich es mit der ABS-Funktion (http://www.techfounder.net/2009/02/02/selecting-closest-values-in-mysql/).

SELECT top 1 item_id, ABS(3) AS distance 
FROM ndc 
ORDER BY distance 

Es hat ein ähnliches Problem.

Wie erreiche ich die gewünschten Ergebnisse?

Antwort

3
if @direction = 'up' 
    begin 
     select top(1) item_id from table_name 
     where item_id > @inputNumber 
     order by item_id asc 
    end 
else 
    begin 
     select top(1) item_id from table_name 
     where item_id < @inputNumber 
     order by item_id desc 
    end 
1

Sie können dies in einer einzigen Abfrage übernehmen:

select top 1 item_id 
from ncd 
where (item_id < @item_id and @dir = 'down') or 
     (item_id > item_id and @dir = 'up') 
order by (case when @dir = 'up' then item_id end) asc, 
     (case when @dir = 'down' then item_id end) desc; 

Aber ich rate Ihnen zwei Abfragen zu verwenden:

select top 1 item_id 
from ncd 
where item_id > @item_id 
order by item_id end asc; 

select top 1 item_id 
from ncd 
where item_id < @item_id 
order by item_id end desc; 

Dann if Logik in der gespeicherten Prozedur verwenden. Diese können einen Index auf ncd(item_id) leichter ausnutzen.

0

konnte nicht Sie setzen nur einen Parameter @UpOrDown und in der where-Klausel genannt, setzen

case when @UpOrDown = 'Above' then ITEM_ID > 3 else ITEM_ID < 3 end 
Verwandte Themen