sql – 在两个IP范围之间选择记录

我有一个表存储一个ID,名称,代码,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,我如何检索匹配的记录?

编辑

基于Gordon的答案(我正在收到编译错误)这是我所拥有的:

select PersonnelPC.*
from (select PersonnelPC.*,(
              cast(parsename(iplow,4)*1000000000 as decimal(12,0)) +
              cast(parsename(iplow,3)*1000000 as decimal(12,2)*1000 as decimal(12,0)) +
              (parsename(iplow,1))
             ) as iplow_decimal,(
              cast(parsename(iphigh,0)) +
              cast(parsename(iphigh,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,3)*1000000.0 as decimal(12,2)*1000.0 as decimal(12,1) as decimal(12,0))
             ) as iplow_decimal,(cast(parsename(iphigh,0))
             ) as iphigh_decimal
      from t
     ) t
where 192168002050 between iplow_decimal and iphigh_decimal;

我应该注意,IP地址通常作为4字节的无符号整数存储在数据库中.这使得比较更容易. . .虽然您需要复杂的逻辑(通常包装在一个函数中)来将值转换为可读格式.

相关文章

(一)日志传送架构 (1.1)相关服务器 主服务器 :用于生产的服务器,上面运行这生产SQL Server数据库...
(一)事故背景 最近在SQL Server 2012生产数据库上配置完事物复制(发布订阅)后,生产数据库业务出现了...
(一)测试目的 目前公司使用的SQL SERVER 2012高可用环境为主备模式,其中主库可执行读写操作,备库既...
(一)背景个人在使用sql server时,用到了sql server的发布订阅来做主从同步,类似MySQL的异步复制。在...
UNION和OR谓词 找出 product 和 product2 中售价高于 500 的商品的基本信息. select * from product wh...
datawhale组队学习task03