如果在postgresql

时间:2015-08-13 13:08:35

标签: sql postgresql

我有一张表A作为傻瓜:

id name      nextid    orderset
19  done               4
21  init       27      1
24  sent-req   19      3
27  offer-req  24      2

orderset列为我提供了状态的顺序:init -> offer-req -> sent-req -> done

我需要编写一个查询,对于给定的id,它会给出下一个状态的id

这应该很简单:

select id
from A
where orderset= (select orderset+1 from A where id=Any_Given_ID)

除了最后一个ID之外的所有情况都适用...因为id=19旁边没有,在最后一个的情况下我希望查询返回0

我想与Max(orderset)select order+1 from A where id=Any_Given_ID进行检查,但我似乎无法使其正常运作。

在查询中是可行还是我必须为此操作编写函数?

1 个答案:

答案 0 :(得分:2)

假设订单是连续的,只需使用lead()

select id
from (select coalesce(lead(id) over (order by orderset), 0) as id
      from A
     ) a
where id = Any_Given_ID;

您还可以将方法与聚合一起使用。这可以保证返回一行:

select coalesce(max(id), 0)
from A
where orderset = (select orderset + 1 from A where id = Any_Given_ID);