选择postgres中尚未包含在表中的所有整数

时间:2014-08-22 07:04:36

标签: sql postgresql left-join gaps-and-islands generate-series

我在表格中有一些ID,但两者之间存在差距。我想选择这些差距 例如,我表中的整数是:

1
2
5
9
15

我想选择:

3
4
6
7
8
10
11
12
13
14

我的PostgreSQL版本是9.1.1,所以我不能使用int4range。

2 个答案:

答案 0 :(得分:5)

在表格中使用generate_series()LEFT JOIN

SELECT g.nr
FROM   generate_series(1,15) g(nr)
LEFT   JOIN tbl USING (nr)
WHERE  tbl.nr IS NULL;

将所有出现的nr替换为您的实际列名 或者使用其他一种基本技术:

动态确定范围:

SELECT g.nr
FROM  (SELECT generate_series(min(nr), max(nr)) AS nr FROM tbl) g
LEFT   JOIN tbl USING (nr)
WHERE  tbl.nr IS NULL;

答案 1 :(得分:2)

with t (id) as (
values (1), (2), (5), (9), (15)
)
select * from generate_series((select min(id) from t), (select max(id) from t)) as g(id)
where g.id not in (select id from t)