Sql 按主键顺序获取下一个id

Sql 按主键顺序获取下一个id,sql,postgresql,loops,plpgsql,Sql,Postgresql,Loops,Plpgsql,我想在给定条件下循环ID: BEGIN ...LOOP SELECT attr FROM emp INTO myAttr where id=givenID; IF <condition> THEN givenID = __successorID(givenID)__; -- dummy func. of getting next id in order END IF; END LOOP; END; $$

我想在给定条件下循环ID:

    BEGIN
    ...LOOP
     SELECT attr FROM emp INTO myAttr where id=givenID;
     IF <condition> THEN
        givenID = __successorID(givenID)__; -- dummy func. of getting next id in order
     END IF;
    END LOOP;
    END;

$$ LANGUAGE plpgsql
创建:

CREATE TABLE invoices (
   id serial PRIMARY KEY,
   issue_time timestamp NOT NULL
);

INSERT INTO invoices (id, issue_time)
VALUES
   (1, '2017-05-09 00:01:01')
 , (2, '2017-05-09 00:01:01')
 , (3, '2017-05-09 00:01:01')
 , (4, '2017-05-09 00:01:01')

 , (5, '2017-05-09 00:02:02')
 , (6, '2017-05-09 00:02:02')
 , (7, '2017-05-09 00:02:02')

 , (8, '2017-05-09 00:02:03')

 , (9, '2017-05-09 00:03:03')
 , (10,'2017-05-09 00:03:03')
 , (11,'2017-05-09 00:03:03');
因此,假设
时间戳
是非递减的,我想得到给定
时间戳
的min/max
id
。我在这里使用存储过程是因为我想将它的执行时间与使用
clock_timestamp()的其他实现进行比较程序


我的程序是使用二进制搜索获取最小值/最大值的最佳方法还是有更优的解决方案?不确定我如何正确理解您的问题

如果您有
givenID
,并且基于此,您需要在主键列中获取下一个
id
,那么这非常简单:

select min(id) as next_id from table where id > givenID

这听起来很奇怪。你想解决的真正问题是什么?为什么你使用一个循环而不是一个查询?只是在POST中添加了澄清,我仍然不知道你想要实现什么。你为什么需要“下一个身份证”?你拿它干什么?为什么要在循环中迭代而不是使用查询?请回答您的问题,并添加一些示例数据和基于该数据的预期输出。请如果您正试图通过此方法生成唯一ID,则不要这样做。使用sequenceI我想为给定的非键attr值查找最小ID。它类似于按id排序的数组中的二进制搜索。我不想产生我想找到的东西。按照通常的ICemantal方式,我可以简单地说
id=id+1
,但它总是有意义的吗?您的问题,并添加一些样本数据和基于该数据的预期输出。请,。我不能只键入
id=id+1
?它总是有意义吗?@mCs-如果你确定你的id列中没有“漏洞”,那么你可以。虽然,几乎总是在主键列中存在这些“漏洞”(如果不是现在的话,您应该期待),所以查询是这个问题的唯一plpgsql解决方案,可以处理您知道的id为“漏洞”的ISSUE?@mCs-这根本不是plpgsql,而是简单的sql,还有许多其他方法,用于在PK中查找下一个值。嗯,这是最简单的方法。
select min(id) as next_id from table where id > givenID