向各位大哥问好.
我有个留言的表要出来,暂叫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比较我自己解决
谢谢
我有个留言的表要出来,暂叫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比较我自己解决
谢谢
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))
还是要谢谢mengmou()mengmou()
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 = '北京'