向各位大哥问好.
我有个留言的表要出来,暂叫liuyan
里面有字段留言内容content,记录有留言ip,
另外有一个表,用来存放本市的iP段的,叫theips表吧
theips里面有两个表,表示ip段的开始和结束,s_ip和e_ip
但是一段一段的ip不是连续的
如10.0.0.1到10.10.10.10
下一个段就是30.30.30.30开始的了
现在我的问题就是
sql="select * from liuyan where ip not in theips这个表里的"
怎么写后面的呢
后者有别的联合查询也行
请大家多多指教
关键还要考虑效率问题
因为数据量大
留言的内容大概有15万条
不能每一个ip都拿到ip表比较吧
只说思路
具体的ip比较我自己解决
谢谢

解决方案 »

  1.   

    将ip地址字符串转换为数值再进行比较。
    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[f_IP2Int]') and xtype in (N'FN', N'IF', N'TF'))
    drop function [dbo].[f_IP2Int]
    GO--1. 字符串IP地址转换成IP数值函数--邹建写的。
    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)
    ENDGO
    select * from liuyan 
    where not exists 
      (select 1 from theips 
       where dbo.f_IP2Int(liuyan.ip) between dbo.f_IP2Int(s_ip) and dbo.f_IP2Int(e_ip))
      

  2.   

    虽然我还是看不懂那个函数
    还是要谢谢mengmou()mengmou()
      

  3.   

    你要是想效率高,我给你一个思路程序你自己写就好了1:在你的留言表里弄一个数字字段就叫IP_KEY,可以考虑在上面建立一个索引,它的值是10*256*256*256+10*256*256+10*256+10,每次插入这个表的时候就自动将这个字段填写上,或者用一个触发器也可以。
    2:将你的IP地址范围也增加两个字段,分别保存开始的IP_KEY和结束的IP_KEY这样,就可以把查询转换为数字比较SELECT * FROM TB_BBS A,TB_IP_ADDRESS B
    WHERE A.IP_KEY >= B.IP_KEY_BEGIN
      AND A.IP_KEY <= B.IP_KEY_END
      AND B.IP_NAME = '北京'