sql - 选择两个 IP 范围之间的记录

标签 sql sql-server

我有一个表,其中存储 IDNameCodeIPLowIPHigh 如:

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/

相关文章:

php - 带有PHP的SQL mysqli_fetch_array错误

sql-server - SQL Server : DELETE FROM table FROM table

sql - 如何简单地加入 Rails 中的 n 对 n 关联?

sql - 我应该使用多对多关系还是通过一对多关系获取信息?

SQL 服务器。如何考虑所有小数位对小数进行四舍五入

c# - SqlDataReader 和 SQL Server 2016 FOR JSON 将 json 拆分为 2k 字节的 block

sql - 如何快速检测并解决数据库的SQL Server索引碎片?

c# - 在 Fluent NHibernate 中自动截断字符串

sql - 使用 Oracle 数据创建 SSAS 多维数据集是否必须使用 SSIS?

sql - 同时发生冲突的更新查询