查询IP数据库的问题。。帮顶有分!

zzlazio 2008-08-28 10:50:52
我在网上下了个纯真的IP数据库,并把他导入到SQL SERVER 2000库中

表的结构为

StartIp varchar(16)
EndIp varchar(16)
country varchar(100)
local varchar(20)

所有的IP地址都是以正常的IP字符形式存入 如 218.18.159.177

但现在问题我的SQL查询语句不知道怎么写才对,如果我写
select * from Tab_IP where '218.18.159.177' Between startIP and EndIP

得到的结果是
218.176.0.0 218.183.255.255 日本 CZ88.NET NULL
218.18.158.0 218.18.167.255 广东省深圳市 电信ADSL NULL
218.17.254.0 218.18.3.255 广东省深圳市罗湖区 电信 NULL

这其中明显只有第二条是符合要求的呀
...全文
125 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
zzlazio 2008-09-01
  • 打赏
  • 举报
回复
已经搞定了。一个表两个字段,格式化用掉了将近24小时。。

时间是够长的啊,就当小猫下载了一部DVD。。

不过运行起来效果还不错。。谢谢大家了
zzlazio 2008-08-29
  • 打赏
  • 举报
回复
已经运行31分钟,不知道是否还需要一个31分钟,这还只是一个字段而已

崩溃了,游标的效率还真不是一般的低
sxmonsy 2008-08-29
  • 打赏
  • 举报
回复
在SQL里用SubString.用法如下SUBSTRING ( expression , start , length )
zzlazio 2008-08-29
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 cftea 的回复:]
BETWEEN 可以比较数字、文本、日期,这里是文本。

考察:218.176.
218.18.
先比较第一个字符相等,第二个也相等,直到第六个,发现 7 < 8,符合条件,就选出来了。

解决办法:
格式化 IP,全部格式化为 16 位,比如:
218.176.000.000
218.018.158.000
进入 WHERE 的 218.18.159.177 也要格式化为 218.018.159.177。
[/Quote]

恩,我现在也在想用这种方式处理,问题到现在就变成如何把数据库字段里的IP给格式化一下了。

朋友后面的那个游标我正在运行,30W+的数据,运行时间还是有点长的
cftea 2008-08-29
  • 打赏
  • 举报
回复
SQL 中没有类似 SPLIT 的函数。我写了一个格式化 StartIP 的,你在查询分析器中运行一下,然后把 StartIP 替换成 EndIP 再运行一下,数据库中的就 OK 了。
declare cr cursor for select StartIP from Tab_IP
open cr

declare @StartIP varchar(16)
fetch next from cr into @StartIP
while @@fetch_status=0
begin
declare @NewStartIP varchar(16)
declare @pos0 int, @pos1 int, @pos2 int, @pos3 int, @pos4 int
select @pos0 = 0
select @pos1 = charindex('.', @StartIP, @pos0 + 1)
select @pos2 = charindex('.', @StartIP, @pos1 + 1)
select @pos3 = charindex('.', @StartIP, @pos2 + 1)
select @pos4 = Len(@StartIP) + 1
select @NewStartIP = replicate('0', 3 - (@pos1 - @pos0 - 1)) + substring(@StartIP, @pos0 + 1, @pos1-@pos0) +
replicate('0', 3 - (@pos2 - @pos1 - 1)) + substring(@StartIP, @pos1 + 1, @pos2-@pos1) +
replicate('0', 3 - (@pos3 - @pos2 - 1)) + substring(@StartIP, @pos2 + 1, @pos3-@pos2) +
replicate('0', 3 - (@pos4 - @pos3 - 1)) + substring(@StartIP, @pos3 + 1, @pos4-@pos3)
update Tab_IP set StartIP=@NewStartIP where StartIP=@StartIP

fetch next from cr into @StartIP
end

close cr
deallocate cr
格拉 2008-08-29
  • 打赏
  • 举报
回复
帮顶
zzlazio 2008-08-29
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 mzmxchenweij 的回复:]
可否用substring分割字符串再比较,我是菜鸟一个,仅参考
[/Quote]

不知道在SQL里面有没有类似Split的函数?
lude8880 2008-08-29
  • 打赏
  • 举报
回复
蹭分
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 cftea 的回复:]
BETWEEN 可以比较数字、文本、日期,这里是文本。

考察:218.176.
218.18.
先比较第一个字符相等,第二个也相等,直到第六个,发现 7 < 8,符合条件,就选出来了。

解决办法:
格式化 IP,全部格式化为 16 位,比如:
218.176.000.000
218.018.158.000
进入 WHERE 的 218.18.159.177 也要格式化为 218.018.159.177。
[/Quote]
固定格式的就可以比较出来。只要在存取的时候做一下格式化处理就可以了。
cftea 2008-08-29
  • 打赏
  • 举报
回复
BETWEEN 可以比较数字、文本、日期,这里是文本。

考察:218.176.
218.18.
先比较第一个字符相等,第二个也相等,直到第六个,发现 7 < 8,符合条件,就选出来了。

解决办法:
格式化 IP,全部格式化为 16 位,比如:
218.176.000.000
218.018.158.000
进入 WHERE 的 218.18.159.177 也要格式化为 218.018.159.177。
lily_baby1983 2008-08-29
  • 打赏
  • 举报
回复
帮顶!
Adechen 2008-08-29
  • 打赏
  • 举报
回复
可否用substring分割字符串再比较,我是菜鸟一个,仅参考
zzlazio 2008-08-29
  • 打赏
  • 举报
回复
郁闷,没人会吗??自己顶顶
zzlazio 2008-08-28
  • 打赏
  • 举报
回复
那请问下,我该如何写这个SQL语句呢?
justindreams 2008-08-28
  • 打赏
  • 举报
回复
这是按照字符串来比的,比如第一条,按字符串比,176比18小,18比183小

111,098

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧