Sql 按主键顺序获取下一个id
我想在给定条件下循环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; $$
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/maxid
。我在这里使用存储过程是因为我想将它的执行时间与使用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