如何在 SQL 中查找范围内的空白
Posted
技术标签:
【中文标题】如何在 SQL 中查找范围内的空白【英文标题】:How to find a gap in range in SQL 【发布时间】:2013-07-22 07:55:00 【问题描述】:This question 解释了如何在表中找到第一个“未使用”的数字,但我怎样才能找到相同的数字以便我可以定义额外的约束。如何更改查询,以便获得大于 100 的第一个未使用的数字
例如如果我的表中有 23、56、100、101、103,我应该得到 102。
【问题讨论】:
包含where mo.id > 100
条件(在接受的答案中的任何查询中)。
您使用的是哪个 DBMS?后格雷斯?甲骨文?
目前我正在使用 SQLite,但很可能稍后会迁移到 PostgreSQL。
【参考方案1】:
在 mysql 和 postgresql 中
SELECT id + 1
FROM test mo
WHERE NOT EXISTS
(
SELECT NULL
FROM test mi
WHERE mi.id = mo.id + 1
) and mo.id> 100
ORDER BY
id
LIMIT 1
fiddle for mysql 和 fiddle for postgresql
在 ms sql 中
SELECT TOP 1
id + 1
FROM test mo
WHERE NOT EXISTS
(
SELECT NULL
FROM test mi
WHERE mi.id = mo.id + 1
)
and mo.id > 100
ORDER BY
id
fiddle
【讨论】:
【参考方案2】:在Oracle Sql中,你可以试试:
SELECT id
FROM
(SELECT ID, lead(ID) OVER(ORDER BY ID) next_val FROM my_table t
)
WHERE id +1 <> next_val
AND id >100;
【讨论】:
这实际上不是 Oracle 特定的。它使用标准的 ANSI SQL 窗口函数,该函数也适用于 Postgres、SQL Server 2012、DB2 和许多其他现代 DBMS。【参考方案3】:希望对你有帮助
SELECT MIN (id) + 1
FROM myTable T1
WHERE id >= 100
AND NOT EXISTS (SELECT *
FROM myTable T2
WHERE T1.id + 1 = T2.id)
【讨论】:
工作得很好,除非 id 101 是免费的并且第一个被占用的 1000,我会因为一些奇怪的原因得到 1001.... 在这种情况下,您必须将“id > 100”替换为“id >= 100”,如查询所示【参考方案4】:使用 generate_series() 获得乐趣和利润:
CREATE table islands (num INTEGER NOT NULL PRIMARY KEY);
INSERT INTO islands (num ) VALUES
(23), (56), (100), (101), (103) ;
WITH total AS (
SELECT generate_series(mima.bot, mima.top) AS num
FROM ( SELECT MIN(num) AS bot , MAX(num) AS top FROM islands) mima
)
SELECT num
FROM total tt
WHERE num >=100
AND NOT EXISTS (
SELECT *
FROM islands ii
WHERE ii.num = tt.num
)
;
【讨论】:
【参考方案5】:使用这个:
SELECT TOP 1 a1.id + 1 FROM test a1 left JOIN test a2
ON a1.id = a2.id - 1
WHERE a2.id IS NULL AND a1.id > 100
【讨论】:
以上是关于如何在 SQL 中查找范围内的空白的主要内容,如果未能解决你的问题,请参考以下文章