gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 13:15:21 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com