日期:2014-05-19  浏览次数:20555 次

如何做ip排除检索?
向各位大哥问好.
我有个留言的表要出来,暂叫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比较我自己解决
谢谢


------解决方案--------------------
将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)
END

GO


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))
------解决方案--------------------
你要是想效率高,我给你一个思路程序你自己写就好了

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 = '北京 '