SQL语句查询IP段

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL语句查询IP段相关的知识,希望对你有一定的参考价值。

数据库中有一个IP表,存储IP段和相对应的地址,里面有三列,分别是
IPstart,
IPend,
address.
我在网页中获取用户的IP地址,然后在数据库中查询该用户所属的address;

请贴上详细的代码 , 跪谢 .

你这种数据结构的话,应该先把IP地址转换成数值,才能用 数值 比较查询。

IP协议规定IP总长度是32位的,所以每组是8位

如果我们把ip地址看成 a.b.c.d,那么转成IP数值就是

d*2的0次方 + c*2的8次方 + b*2的16次方 + a*2的24次方

为了实现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

-- 字符串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 address
from IP_table
where f_ip2int(IP_address) beween f_ip2int(IP_start) and f_ip2int(IP_end)
参考技术A --先构建一个转换ip地址格式的函数 以‘.’为间隔按4段拆分 每段前端补0 然后截取3位
--可将‘1.1.166.0’转换为‘001001166000’
create function convertIP (@strIP varchar(20))
returns varchar(20)
as
begin
declare @str1 varchar(6),@str2 varchar(6),@str3 varchar(6),@str4 varchar(6),
@i int,@j int,@k int,@m int
set @i=1
set @j=1
set @k=1
set @m=1
while (@i<=len(@strIP))
begin
if (substring(@strIP,@i,1)='.')
begin
if @k=1 set @str1=substring(@strIP,@m,@j-1)
if @k=2 set @str2=substring(@strIP,@m,@j-1)
if @k=3 set @str3=substring(@strIP,@m,@j-1)
set @j=1
set @m=@i+1
set @k=@k+1
end
else
set @j=@j+1
set @i=@i+1
end
set @str4=substring(@strIP,@m,@j-1)
set @str1='000'+@str1
set @str1=substring(@str1,len(@str1)-2,3)
set @str2='000'+@str2
set @str2=substring(@str2,len(@str2)-2,3)
set @str3='000'+@str3
set @str3=substring(@str3,len(@str3)-2,3)
set @str4='000'+@str4
set @str4=substring(@str4,len(@str4)-2,3)
return @str1+@str2+@str3+@str4
end
--查询ip地址为标准格式 例如'201.125.12.203'
select address from IP where dbo.convertIP(IPstart)<=dbo.convert('201.125.12.203') and dbo.convertIP(IPend)>=dbo.convertIP('201.125.12.203')本回答被提问者采纳

使用正则表达式获取Sql查询语句各项(表名字段条件排序)

     string text = "select * from [admin] where aa=1 and cc=‘b‘ order by aa desc ";
     Regex reg = null; reg = new Regex(@"\s+from\s+.*?(\s+where\s+|\s+order\s+|\s+group\s+)|\s+from\s+.+", RegexOptions.IgnoreCase);
string table = reg.Match(text).Value; table = Regex.Replace(table.ToLower(), @"\s+from\s+|\s+where\s+|\[|\]|\s+order\s+|\s+group\s+", "");
reg = new Regex(@"select\s+.*?\s+from\s+", RegexOptions.IgnoreCase); string field = reg.Match(text).Value;
field = Regex.Replace(field.ToLower(), @"select\s+|\s+from\s+|\[|\]", ""); reg = new Regex(@"\s+where\s+.*?(\s+order\s+|\s+group\s+)|\s+where\s+.+", RegexOptions.IgnoreCase); string condition = reg.Match(text).Value; condition = Regex.Replace(condition.ToLower(), @"\s+where\s+|\s+order\s+|\s+group\s+|\[|\]", ""); reg = new Regex(@"\s+order\s+by\s+.*?\s(desc|asc)|\s+order\s+by\s+.*?\s", RegexOptions.IgnoreCase); string order = reg.Match(text).Value; order = Regex.Replace(order.ToLower(),@"\s+order\s+by\s+|\[|\]", "");

  

以上是关于SQL语句查询IP段的主要内容,如果未能解决你的问题,请参考以下文章

sql语句如何查找在一段时间内没有交易记录的用户

sql语句,怎么将一段日期分割成每日?请高人解答。

在SQLServer中的查询语句

想用sql语句实现:查询出在最近10分钟(或一段时间区间内)插入数据库某个表的所有数据。

sql语句如何去掉一段特别长的文字最后一个字符?

sql 中的查询语句