SQL |从当前ID循环获取下一个和上一个ID

时间:2018-08-09 07:00:46

标签: sql

我的桌子上有以下ID。

String

如果当前ID为26,则能够轻松获取next和prev id,但如果当前id为36,则无法获取next和prev id。这给了我null的下一个记录。有没有可能给我身份证件。这是我的代码,用于下一个和上一个ID的获取。

下一条记录:

[25,26,36]

以前的记录:

SELECT * FROM foo WHERE id > 26 ORDER BY id LIMIT 1;

3 个答案:

答案 0 :(得分:0)

尝试:

select a.id, CASE WHEN lag(a.id)over(order by a.v) is null then max(b.id) else lag(a.id)over(order by a.v) end as pr,
CASE WHEN  lead(a.id)over(order by a.v) is null then min(b.id) else lead(a.id)over(order by a.v) 
end as n 
from t1 a , t1 b
group by a.id,a.v

列“ v”是主键

输出:http://sqlfiddle.com/#!18/eb72b/22

答案 1 :(得分:0)

除非SQL引擎不支持,否则请使用LAG / LEAD获取上一个/下一个值。

SELECT *, 
       LAG(Id) OVER(ORDER BY Id) AS PreValue, 
       LEAD(Id) OVER(ORDER BY Id) AS NextValue
FROM (VALUES (25), (26), (36)) AS T(Id)

给出结果

Id  PreValue    NextValue
25  NULL        26
26  25          36
36  26          NULL

然后回落到最大/最小id

SELECT *,
    COALESCE(LAG(Id) OVER(ORDER BY Id), MAX(Id) OVER()) AS PreValue, 
    COALESCE(LEAD(Id) OVER(ORDER BY Id), MIN(Id) OVER()) AS NextValue
FROM (VALUES (25), (26), (36)) AS T(Id)

注意,默认分区是整个表。当您拥有自己的分区时,请在四个OVER子句中使它们保持同步。

答案 2 :(得分:0)

您可以通过将过滤条件移至editText.invalidate()来完成此操作:

ORDER BY

与上一个类似:

SELECT *
FROM foo
ORDER BY (CASE WHEN id > 26 THEN id END) ASC,
         ID ASC
LIMIT 1;
相关问题