获取主键顺序中的下一个ID

时间:2017-05-06 09:02:10

标签: 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;

$$ 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();过程比较其执行的时间。

我的程序是使用二分查找获得最小值/最大值的最佳方法还是有更优化的解决方案?

1 个答案:

答案 0 :(得分:2)

不确定我是如何正确理解你的问题的。

如果你有givenID并且基于此,你需要在主键列中获得下一个id,这很简单:

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