010.010.000.000  010.016.255.255  天津169用户
010.010.064.000  010.016.076.255  天津169电信
010.010.191.000  010.010.193.255  天津169拨号用户
010.011.017.000  010.011.029.255  天津169专线用户
010.013.002.000  010.011.002.255  天津169专线用户
010.013.048.000  010.011.048.255  天津169专线用户
010.013.064.000  010.011.064.255  天津169专线用户
010.017.000.000  010.017.000.255  河北169省电信
010.017.000.000  010.022.255.255  河北169用户
010.017.016.000  010.017.016.255  河北ZX
010.017.032.000  010.017.032.255  河北邯郸
010.017.040.000  010.017.040.255  河北邯郸169用户
010.017.144.000  010.017.148.255  河北石家庄169用户
010.017.178.000  010.017.178.255  河北石家庄169用户
010.017.191.000  010.017.191.255  河北石家庄169用户
010.018.000.000  010.018.001.255  河北保定169电信
010.018.000.000  010.018.095.255  河北保定
010.018.008.000  010.018.008.255  河北保定169拨号用户
010.018.096.000  010.018.127.255  河北张家口
010.018.100.000  010.018.100.255  河北张家口169用户
010.018.128.000  010.018.159.255  河北承德
010.018.132.000  010.018.132.255  河北承德169用户
010.018.160.000  010.018.255.255  河北唐山
010.018.168.000  010.018.168.255  河北唐山169用户
010.019.000.000  010.019.063.255  河北廊坊
010.019.008.000  010.019.008.255  河北廊坊169用户
010.019.064.000  010.019.127.255  河北沧州
010.019.072.000  010.019.072.255  河北沧州169用户
010.019.128.000  010.019.159.255  河北衡水
010.019.132.000  010.019.132.255  河北衡水169用户
010.019.160.000  010.019.192.255  河北邢台
010.019.164.000  010.019.164.255  河北邢台169用户
010.019.192.000  010.019.255.255  河北秦皇岛
010.019.200.000  010.019.200.255  河北秦皇岛169用户已知以上结构的数据,我想设计一个或几个表,可以实现输入一个IP地址得到所在地。我想了好长时间没有好的思路。因为里边又有嵌套的问题,比较的问题,希望高手指教。

解决方案 »

  1.   

    我想了一个办法,不知道行还是不行:
    首先上面的地址应该保存为没有点的格式
    比如:010.019.128.000  保存为:010019128000
    这样网段长度就可以用相减的方法得到.
    如果通过比较可以得到多条数据,则取网段长度最小的就可以了.
    比如数据库设计为这样(表名:TAB1):
    id    VARCHAR2(20) 主键;
    ipmin VARCHAR2(12);
    ipmax VARCHAR2(12);
    dz    VARCHAR2(100);
    则可以用下面的语句得到你要的结果(由于当前没有调试环境,不能保证语句的正确,还请原谅):
    select dz from (select id,to_number(ipmax) - to_number(ipmin) wdcd,dz from TAB1 where ipmin <= 指定ip and ipmax >= 指定ip order by wdcd) where rownum <= 1;