【发布时间】:2014-11-20 19:19:26
【问题描述】:
我在 SQL Server 2005 中有一个包含以下字段和示例数据的表:
id block block_start block_end size
523 10.211.15.16/28 0x0AD30F10 0x0AD30F1F 16
531 10.211.15.36/30 0x0AD30F24 0x0AD30F27 4
532 10.211.15.40/29 0x0AD30F28 0x0AD30F2F 8
533 10.211.15.48/29 0x0AD30F30 0x0AD30F37 8
525 10.211.15.72/29 0x0AD30F48 0x0AD30F4F 8
id 是一个 INT 标识列。 block 是 VARCHAR(18),表示 CIDR 格式的 IP 块。 block_start 和 block_end 是 BINARY(4),分别代表块中的第一个和最后一个 IPv4 地址。大小是块中 IP 地址的数量。
以给定的 IP 范围和 IP 数量作为输入,我需要一种方法来查询第一个可用间隙。例如,我可能想找到 10.211.15.16 和 10.211.15.80 之间的 4 个 IP 地址的第一个缺失间隔。在本例中,正确的输出应该是 10.211.15.32/30(0x0AD30F20 到 0x0AD30F23)。如果我希望 8 IP 地址的第一个间隙在同一范围内,正确的输出应该是 10.211.15.56/29(0x0AD30F38 到 0x0AD30F3F)。
CIDR (varchar) 或二进制格式的输出不是问题,因为我有可以在两者之间轻松转换的函数,但我想需要对二进制字段进行查询。
如有必要,我可以利用应用程序逻辑(Java 或 ColdFusion),但如果我能提供帮助,我宁愿不这样做。
添加了 sqlfiddle:http://sqlfiddle.com/#!3/d45ad
【问题讨论】:
-
能否添加sqlfiddle
标签: sql sql-server tsql sql-server-2005