我有一个表,其中存储 ID
、Name
、Code
、IPLow
、IPHigh
如:
1, Lucas, 804645, 192.130.1.1, 192.130.1.254
2, Maria, 222255, 192.168.2.1, 192.168.2.254
3, Julia, 123456, 192.150.3.1, 192.150.3.254
现在,如果我有一个 IP 地址 192.168.2.50
,如何检索匹配的记录?
编辑
根据戈登的回答(我收到编译错误),这就是我所拥有的:
select PersonnelPC.*
from (select PersonnelPC.*,
(
cast(parsename(iplow, 4)*1000000000 as decimal(12, 0)) +
cast(parsename(iplow, 3)*1000000 as decimal(12, 0)) +
cast(parsename(iplow, 2)*1000 as decimal(12, 0)) +
(parsename(iplow, 1))
) as iplow_decimal,
(
cast(parsename(iphigh, 4)*1000000000 as decimal(12, 0)) +
cast(parsename(iphigh, 3)*1000000 as decimal(12, 0)) +
cast(parsename(iphigh, 2)*1000 as decimal(12, 0)) +
(parsename(iphigh, 1))
) as iphigh_decimal
from PersonnelPC
) PersonnelPC
where 192168002050 between iplow_decimal and iphigh_decimal;
但这给了我一个错误:
Msg 8115, Level 16, State 2, Line 1
Arithmetic overflow error converting expression to data type int.
有什么想法吗?
最佳答案
痛苦。 SQL Server 的字符串操作函数很糟糕。然而,它确实提供了parsename()
。此方法将 IP 地址转换为一个大的十进制值以进行比较:
select t.*
from (select t.*,
(cast(parsename(iplow, 4)*1000000000.0 as decimal(12, 0)) +
cast(parsename(iplow, 3)*1000000.0 as decimal(12, 0)) +
cast(parsename(iplow, 2)*1000.0 as decimal(12, 0)) +
cast(parsename(iplow, 1) as decimal(12, 0))
) as iplow_decimal,
(cast(parsename(iphigh, 4)*1000000000.0 as decimal(12, 0)) +
cast(parsename(iphigh, 3)*1000000.0 as decimal(12, 0)) +
cast(parsename(iphigh, 2)*1000.0 as decimal(12, 0)) +
cast(parsename(iphigh, 1) as decimal(12, 0))
) as iphigh_decimal
from t
) t
where 192168002050 between iplow_decimal and iphigh_decimal;
我应该注意到,IP 地址通常以 4 字节无符号整数的形式存储在数据库中。这使得比较变得更加容易。 。 。尽管您需要复杂的逻辑(通常包含在函数中)将值转换为可读格式。
关于sql - 选择两个 IP 范围之间的记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36177404/