我有以下用于存储 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/