sql - Postgresql - 在 INET 范围内找到第一个差距

标签 sql postgresql

我有以下用于存储 IP 的表结构 (PostgreSQL):

CREATE TABLE ips (
  ip INET NOT NULL
);

INSERT INTO ips VALUES ('127.0.0.1');
INSERT INTO ips VALUES ('127.0.0.5');
INSERT INTO ips VALUES ('127.0.0.6');

我如何找到 127.0.0.2,因为它是下一个免费的最低 IP?

我有点纠结于如何以优化的方式解决这个问题。

这似乎可以做到,但这是一种减慢子网大小/10(4M+ 记录)的方法:

SELECT sub.ip FROM
(SELECT set_masklen(((generate_series(1, (2 ^ (32 - masklen('127.0.0.0/10'::cidr)))::integer - 2) + '127.0.0.0/10'::cidr)::inet), 32) as ip) AS sub
WHERE sub.ip NOT IN
(SELECT ip from ips)
AND sub.ip > set_masklen('127.0.0.0/10', 32)
AND sub.ip < set_masklen(broadcast('127.0.0.0/10')::inet, 32)
ORDER BY ip ASC LIMIT 1;

最佳答案

您可以使用 inet功能:

select ips.ip + 1
from ips
where not exists (select 1 from ips ips2 where ips2.ip = ips.ip + 1)
order by ips.ip
limit 1;

关于sql - Postgresql - 在 INET 范围内找到第一个差距,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49943135/

相关文章:

sql - 从仅具有一个不同列 SQL 的重复发生中选择一个重复项

sql - 优化 1000 万行表的 SQL 查询 : neverending query

sql - Select 语句以查找某些字段上的重复项

python - Select into subdict 从多个表

mysql - 如何替换 SELECT 查询中重复记录的列?

javascript - 使用 % 进行查询(ajax+javascript+html)

sql - 从列中为其他两列中的每个值选择最大值

sql - PostgreSQL 更新时区偏移量

ruby-on-rails - 如何在 Ruby on Rails 中将 find_by_sql hstore 字符串转换为哈希值

java - 使用 Java 将 Flex 与 Blazeds 集成的问题