SQL语句查询IP段
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL语句查询IP段相关的知识,希望对你有一定的参考价值。
数据库中有一个IP表,存储IP段和相对应的地址,里面有三列,分别是
IPstart,
IPend,
address.
我在网页中获取用户的IP地址,然后在数据库中查询该用户所属的address;
请贴上详细的代码 , 跪谢 .
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段的主要内容,如果未能解决你的问题,请参考以下文章