我想为给定条件循环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
如何根据id
表中的id
顺序获取下一个emp
,即如何获取虚拟succesorID
功能?
例如:
如果是id
:1,2,3,4系列succesor(3)
将是4等。
我需要使用命令式迭代构造在表中为给定的id
获取下一个id
值。
修改
我想根据非索引列(此处为日期the_date
)值找到最小PK索引值。 pk正在增加,而日期也是单声道的。
以下是完整的解决方案,或者是否可以以某种方式进行优化?:
CREATE OR REPLACE FUNCTION get_min_find_by_date (
the_date DATE
) RETURNS integer AS $$
DECLARE
mid_val INTEGER;
max_id INTEGER;
min_id INTEGER;
mid_id INTEGER;
act_date DATE;
BEGIN
min_id=1;
SELECT MAX (id) INTO max_id FROM invoices;
WHILE min_id <= max_id LOOP
mid_id = (min_id + max_id) >> 1;
SELECT actual_date FROM invoices INTO act_date WHERE id=mid_id;
IF act_date < the_date THEN
min_id = mid_id +1
ELSE IF act_date > the_date THEN
max_id = mid_id -1
ELSE
RETURN mid_id
END IF;
END LOOP;
RETURN -(min_id); -- date not found
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');
因此,假设timestamps
不减少,我想获得给定id
的最小/最大timestamp
。我在这里使用存储过程,因为我想使用clock_timestamp();
过程比较其执行的时间。
我的程序是使用二分查找获得最小值/最大值的最佳方法还是有更优化的解决方案?
答案 0 :(得分:2)
不确定我是如何正确理解你的问题的。
如果你有givenID
并且基于此,你需要在主键列中获得下一个id
,这很简单:
select min(id) as next_id from table where id > givenID