テーブルにいくつかの ID がありますが、間にギャップがあります。これらのギャップを選択したい。
たとえば、私のテーブルの整数は次のとおりです。
1
2
5
9
15
そして、私は選択したい:
3
4
6
7
8
10
11
12
13
14
私の PostgreSQL のバージョンは 9.1.1 なので、int4range を使用できません。
テーブルにいくつかの ID がありますが、間にギャップがあります。これらのギャップを選択したい。
たとえば、私のテーブルの整数は次のとおりです。
1
2
5
9
15
そして、私は選択したい:
3
4
6
7
8
10
11
12
13
14
私の PostgreSQL のバージョンは 9.1.1 なので、int4range を使用できません。
使用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;
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)