当前位置: 首页 > 面试题库 >

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

欧阳勇军
2023-03-14
问题内容

我有一个存储表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字节无符号整数的形式存储在数据库中。这使比较容易得多。。。尽管您需要复杂的逻辑(通常包装在函数中)才能将值转换为可读格式。



 类似资料:
  • 我的目标是创建一个函数,从给定的IP范围中选择一个IP地址。 目前我正在使用此功能: 我知道此函数只生成IP范围,但是在生成该范围后如何选择IP? 示例:我拥有给定的IP范围93.118.193.0-93.118.193.255。在此范围内,自动获取一个(例如:93.118.193.83)并将其设置为“远程地址”属性。如果已经设置了IP,则随机获取另一个IP(以便两个“远程地址”相同)。 我尝试使

  • 问题内容: 如何在MySQL中的日期范围之间选择数据。我的专栏是24小时的祖鲁时间格式。 尽管在这些时间段之间有数据,但不返回任何内容。我是否必须强制 “发件人” 和 “发件人” 字段中的值键入查询? 问题答案: 您需要更新日期格式:

  • 我正在寻找一种方法来选择所有记录,其中一列具有相同的记录,并且日期时间彼此之间的间隔不超过5分钟。我管理一个票务系统,我试图查看5分钟内创建的所有类似票务。有关示例数据集,请参见以下内容: 我的目标是只选择1-5条记录,因为5条记录是同一主题,它们都是在5分钟内创建的。不应选择6-10,因为受试者数量不够多,或者超出了规定的时间范围。 下面是我到目前为止的一个测试查询,但它没有考虑5分钟的范围(我

  • 问题内容: 我正在使用数据库存储日志,其中“日期”列保存了插入日期。日期的格式为“ MM / DD / YY”。请任何人建议我如何在两个特定日期之间选择数据。例如,我尝试了这个: 但是我想这行不通,因为日期不是数字。谢谢您的帮助!:) 问题答案: 使用关键字:

  • 范围选择器(rangeSelector)是图表中用于选择数据范围的工具,它提供了预配置的时间选择按钮,包括 1天,1周,1个月等,同时也提供时间输入框用于手动指定时间范围。 时间选择按钮 通过 rangeSelector.buttons 可以指定时间选择按钮,默认是 buttons: [{ type: 'month', count: 1, text: '1m' }, {

  • 问题内容: 我有这个查询,我需要选择两个日期之间的所有记录,mysql表是datetime格式。 我试过了,但是没有用。 问题答案: 尝试以下方法: