首先,对不起,如果已经问过这个问题,但我到处搜索过(包括这个网站),并且发现了一些类似的情况,但没有与IPv6有关的解决方案。我试图在IPv4地址上实现的解决方案非常慢。 我想基于表B中的IPAddress在表A中的range_from和range_to之间加入2个表。 这是在SQL Server 2008上:
我有2张桌子, 表A包含:
表B包含
所以我需要将表A和表B连接在一起
ON b.IPAddress BETWEEN a.range_from AND a.range_to
这是我的JOIN条款。对于包含IP地址的3个字段,我创建了一个函数,将人类可读的地址转换为BIGINT,以便正确搜索范围:
create function [dbo].[IPAddressToInteger](@ip as varchar(15))
returns bigint
as
begin
return (
convert(bigint, parsename(@ip, 1)) +
convert(bigint, parsename(@ip, 2)) * 256 +
convert(bigint, parsename(@ip, 3)) * 65536 +
convert(bigint, parsename(@ip, 4)) * 16777216
)
end
我的解决方案效率不高,不包含IPv6地址。我不经常使用SQL,并且对SQL不包含任何IPAddress数据类型感到惊讶。
此方案中的最佳做法是什么?