select * from 表 where '218.059.018.130' between IpBegin and IpEnd

解决方案 »

  1.   

    如果你IP的每段都是按0补位的三位,用楼上钻钻的即可.否则参考如下:/*
    判断IP地址在表中两个IP段的位置
    (爱新觉罗.毓华 2007-12-31 广东深圳 答csdn zyciis630)
    原帖地址:http://topic.csdn.net/u/20071230/22/f4c19d7f-194d-47c9-9840-474ca79c782f.html
    *//*问题描述
    比我我IP:220.113.49.43 
    然后我有如下的数据库 
    那么我如何正确的查询出我的IP是符合哪一个数据呢 
    StartIP     EndIP      Area 
    220.112.208.0  220.112.255.255 湖北省武汉市 长城宽带 
    220.113.0.0   220.113.48.255  北京市 长城宽带 
    220.113.49.0   220.113.63.255  广东省广州市 长城宽带 
    220.113.64.0   220.113.79.22  湖北省武汉市 长城宽带 
    220.113.79.23  220.113.79.23  湖北省宜昌市 长城宽带刘家大堰小区 
    220.113.79.24  220.113.81.208  湖北省武汉市 长城宽带 
    220.113.81.209  220.113.81.209  湖北省武汉市 (汉口)解放大道1511号名仕装饰工程有限公司 
    220.113.81.210  220.113.107.52  湖北省武汉市 长城宽带 
    220.113.107.53  220.113.107.53  湖北省武汉市 徐东路逸居苑小区 
    220.113.107.54  220.113.122.182 湖北省武汉市 长城宽带 
    220.113.122.183 220.113.122.183 湖北省武汉市 长城宽带湖北大学校内 
    220.113.122.184 220.113.127.255 湖北省武汉市 长城宽带
    */--------------------------------------------------------------
    create table tb(StartIP varchar(50),EndIP varchar(50),Area varchar(100))
    insert into tb values('220.112.208.0' ,'220.112.255.255','湖北省武汉市 长城宽带') 
    insert into tb values('220.113.0.0' ,'220.113.48.255' ,'北京市 长城宽带') 
    insert into tb values('220.113.49.0' ,'220.113.63.255' ,'广东省广州市 长城宽带') 
    insert into tb values('220.113.64.0' ,'220.113.79.22' ,'湖北省武汉市 长城宽带') 
    insert into tb values('220.113.79.23' ,'220.113.79.23' ,'湖北省宜昌市 长城宽带刘家大堰小区') 
    insert into tb values('220.113.79.24' ,'220.113.81.208' ,'湖北省武汉市 长城宽带') 
    insert into tb values('220.113.81.209' ,'220.113.81.209' ,'湖北省武汉市 (汉口)解放大道1511号名仕装饰工程有限公司 ')
    insert into tb values('220.113.81.210' ,'220.113.107.52' ,'湖北省武汉市 长城宽带') 
    insert into tb values('220.113.107.53' ,'220.113.107.53' ,'湖北省武汉市 徐东路逸居苑小区') 
    insert into tb values('220.113.107.54' ,'220.113.122.182','湖北省武汉市 长城宽带') 
    insert into tb values('220.113.122.183','220.113.122.183','湖北省武汉市 长城宽带湖北大学校内') 
    insert into tb values('220.113.122.184','220.113.127.255','湖北省武汉市 长城宽带')
    godeclare @ip as varchar(50)
    set @ip = '220.113.49.43'select startip , endip , area 
    from tb 
    where
     cast(PARSENAME(@ip , 4) as bigint) * 256 * 256 * 256 + cast(PARSENAME(@ip , 3) as bigint) * 256 * 256 + cast(PARSENAME(@ip , 2) as bigint) * 256 + cast(PARSENAME(@ip , 1) as bigint) >=
     cast(PARSENAME(startip , 4) as bigint) * 256 * 256 * 256 + cast(PARSENAME(startip , 3) as bigint) * 256 * 256 + cast(PARSENAME(startip , 2) as bigint) * 256 + cast(PARSENAME(startip , 1) as bigint) and
     cast(PARSENAME(@ip , 4) as bigint) * 256 * 256 * 256 + cast(PARSENAME(@ip , 3) as bigint) * 256 * 256 + cast(PARSENAME(@ip , 2) as bigint) * 256 + cast(PARSENAME(@ip , 1) as bigint) <=
     cast(PARSENAME(endip , 4) as bigint) * 256 * 256 * 256 + cast(PARSENAME(endip , 3) as bigint) * 256 * 256 + cast(PARSENAME(endip , 2) as bigint) * 256 + cast(PARSENAME(endip , 1) as bigint)drop table tb/*
    startip    endip     area
    -------------- -------------- --------------------
    220.113.49.0  220.113.63.255 广东省广州市 长城宽带(1 行受影响)
    */
    ----以下用函数实现(csdn happyflystone完成)CREATE FUNCTION dbo.f_IP2Int(
    @ip char(15)
    )RETURNS bigint
    AS
    BEGIN
     DECLARE @re bigint
     SET @re=0
     SELECT @re=@re+LEFT(@ip,CHARINDEX('.',@ip+'.')-1)*ID
      ,@ip=STUFF(@ip,1,CHARINDEX('.',@ip+'.'),'')
     FROM(
      SELECT ID=CAST(16777216 as bigint)
      UNION ALL SELECT 65536
      UNION ALL SELECT 256
      UNION ALL SELECT 1)a
     RETURN(@re)
    END
    GOdeclare @t table(StartIP varchar(15),EndIP varchar(15),Area varchar(100))
    insert @t select '220.112.208.0','220.112.255.255','湖北省武汉市 长城宽带 '
    insert @t select '220.113.0.0','220.113.48.255','北京市 长城宽带'
    insert @t select '220.113.49.0','220.113.63.255','广东省广州市 长城宽带 '
    insert @t select '220.113.64.0','220.113.79.22','湖北省武汉市 长城宽带' 
    insert @t select '220.113.79.23','220.113.79.23','湖北省宜昌市 长城宽带刘家大堰小区' 
    insert @t select '220.113.79.24','220.113.81.208','湖北省武汉市 长城宽带' 
    insert @t select '220.113.81.209','220.113.81.209','湖北省武汉市 (汉口)解放大道1511号名仕装饰工程有限公司' 
    insert @t select '220.113.81.210','220.113.107.52','湖北省武汉市 长城宽带 '
    insert @t select '220.113.107.53','220.113.107.53','湖北省武汉市 徐东路逸居苑小区' 
    insert @t select '220.113.107.54','220.113.122.182','湖北省武汉市 长城宽带' 
    insert @t select '220.113.122.183','220.113.122.183','湖北省武汉市 长城宽带湖北大学校内' 
    insert @t select '220.113.122.184','220.113.127.255','湖北省武汉市 长城宽带'
    declare @ip varchar(15)
    set @ip = '220.113.49.43'
    select * 
    from @t
    where dbo.f_IP2Int(@ip) between dbo.f_IP2Int(StartIP) and dbo.f_IP2Int(EndIP)
    drop function f_IP2Int/*
    StartIP      EndIP          Area                         
    ----------------------------------------------
    220.113.49.0 220.113.63.255 广东省广州市 长城宽带 
    (所影响的行数为 1 行)
    */
    ---
    IP为'220.113.53.221' 
    insert into tb values('220.113.49.0' ,'220.113.63.255' ,'广东省广州市 长城宽带') 
    insert into tb values('220.113.53.0' ,'220.113.53.255' ,'广东省广州市 东兴小区长城宽带') 
    也就是有大区间包含小区间。[code=SQL]create table tb(StartIP varchar(50),EndIP varchar(50),Area varchar(100))
    insert into tb values('220.112.208.0' ,'220.112.255.255','湖北省武汉市 长城宽带') 
    insert into tb values('220.113.0.0' ,'220.113.48.255' ,'北京市 长城宽带') 
    insert into tb values('220.113.49.0' ,'220.113.63.255' ,'广东省广州市 长城宽带') 
    insert into tb values('220.113.53.0' ,'220.113.53.255' ,'广东省广州市 东兴小区长城宽带')
    insert into tb values('220.113.64.0' ,'220.113.79.22' ,'湖北省武汉市 长城宽带') 
    insert into tb values('220.113.79.23' ,'220.113.79.23' ,'湖北省宜昌市 长城宽带刘家大堰小区') 
    insert into tb values('220.113.79.24' ,'220.113.81.208' ,'湖北省武汉市 长城宽带') 
    insert into tb values('220.113.81.209' ,'220.113.81.209' ,'湖北省武汉市 (汉口)解放大道1511号名仕装饰工程有限公司 ')
    insert into tb values('220.113.81.210' ,'220.113.107.52' ,'湖北省武汉市 长城宽带') 
    insert into tb values('220.113.107.53' ,'220.113.107.53' ,'湖北省武汉市 徐东路逸居苑小区') 
    insert into tb values('220.113.107.54' ,'220.113.122.182','湖北省武汉市 长城宽带') 
    insert into tb values('220.113.122.183','220.113.122.183','湖北省武汉市 长城宽带湖北大学校内') 
    insert into tb values('220.113.122.184','220.113.127.255','湖北省武汉市 长城宽带')
    go
    declare @ip as varchar(50)
    set @ip = '220.113.53.221'
    select a.* 
    from tb a, 
    (
     select ipscore = min(cast(PARSENAME(endip , 4) as bigint) * 256 * 256 * 256 + cast(PARSENAME(endip , 3) as bigint) * 256 * 256 + cast(PARSENAME(endip , 2) as bigint) * 256 + cast(PARSENAME(endip , 1) as bigint) - 
      cast(PARSENAME(startip , 4) as bigint) * 256 * 256 * 256 + cast(PARSENAME(startip , 3) as bigint) * 256 * 256 + cast(PARSENAME(startip , 2) as bigint) * 256 + cast(PARSENAME(startip , 1) as bigint))
     from tb 
     where
     cast(PARSENAME(@ip , 4) as bigint) * 256 * 256 * 256 + cast(PARSENAME(@ip , 3) as bigint) * 256 * 256 + cast(PARSENAME(@ip , 2) as bigint) * 256 + cast(PARSENAME(@ip , 1) as bigint) >=
     cast(PARSENAME(startip , 4) as bigint) * 256 * 256 * 256 + cast(PARSENAME(startip , 3) as bigint) * 256 * 256 + cast(PARSENAME(startip , 2) as bigint) * 256 + cast(PARSENAME(startip , 1) as bigint) and
     cast(PARSENAME(@ip , 4) as bigint) * 256 * 256 * 256 + cast(PARSENAME(@ip , 3) as bigint) * 256 * 256 + cast(PARSENAME(@ip , 2) as bigint) * 256 + cast(PARSENAME(@ip , 1) as bigint) <=
     cast(PARSENAME(endip , 4) as bigint) * 256 * 256 * 256 + cast(PARSENAME(endip , 3) as bigint) * 256 * 256 + cast(PARSENAME(endip , 2) as bigint) * 256 + cast(PARSENAME(endip , 1) as bigint)
    ) b
    where cast(PARSENAME(a.endip , 4) as bigint) * 256 * 256 * 256 + cast(PARSENAME(a.endip , 3) as bigint) * 256 * 256 + cast(PARSENAME(a.endip , 2) as bigint) * 256 + cast(PARSENAME(a.endip , 1) as bigint) - 
      cast(PARSENAME(a.startip , 4) as bigint) * 256 * 256 * 256 + cast(PARSENAME(a.startip , 3) as bigint) * 256 * 256 + cast(PARSENAME(a.startip , 2) as bigint) * 256 + cast(PARSENAME(a.startip , 1) as bigint)
      = b.ipscoredrop table tb
    /*
    StartIP           EndIP          Area
    ----------------------------------------------------------
    220.113.53.0      220.113.53.255 广东省广州市 东兴小区长城宽带(1 行受影响)
    */[/code]