我正在努力匹配IP地址。输入IP地址可以是"5.1.82.1“。
因此,我将输入IP地址的第一部分与数据库中以5开头的所有IP地址进行匹配。我的查询如下所示
SELECT top 1 PARSENAME(ipaddress, 4) AS firstpart, ipaddress
FROM IPs
WHERE (Country = 'pk') AND (PARSENAME(ipaddress, 4) <= '5')
ORDER BY Expr2 DESC以上查询的结果是以5开头的所有IP地址。现在,我需要将地址的第二部分,即"1“与数据库中的IP地址范围相匹配。为此,我将再次执行"order by“,并选择接近输入IP地址第二部分的顶部记录。
所以我也会在第三部分和第四部分做同样的事情。但问题是我怎么能做到?我想我需要使用一个子查询。但是,我将把它放在SQL语句中。
更新
样本数据
from to country
[5.1.82.0] [5.1.82.255] PK
[5.39.250.0] [5.39.253.255] PK
[5.39.255.0] [5.39.255.255] PK重要的在数据库中有IP地址的范围,例如:5.1.82.0到5.1.82.255
发布于 2015-04-20 06:19:16
对于相同的thing.Try,我使用了以下函数--它也适用于您。
它验证用户的IP地址是否在IP地址的范围内。下面的脚本将返回1,如果IP地址在范围之间,否则返回0;
CREATE FUNCTION IsIPAddressInRange
(
@IPAddress varchar(20),
@StartRange varchar(20),
@EndRange varchar(20)
)
RETURNS INT
AS
BEGIN
DECLARE @MAXRANGE BIGINT = 256
RETURN
CASE
WHEN PARSENAME(@IPAddress,1) + @MAXRANGE * PARSENAME(@IPAddress,2) +
@MAXRANGE * @MAXRANGE * PARSENAME(@IPAddress ,3) + @MAXRANGE * @MAXRANGE * @MAXRANGE * PARSENAME(@IPAddress ,4)
BETWEEN
PARSENAME(@StartRange,1) + @MAXRANGE * PARSENAME(@StartRange,2) +
@MAXRANGE * @MAXRANGE * PARSENAME(@StartRange ,3) + @MAXRANGE * @MAXRANGE * @MAXRANGE * PARSENAME(@StartRange ,4)
AND
PARSENAME(@EndRange,1) + @MAXRANGE * PARSENAME(@EndRange,2) +
@MAXRANGE * @MAXRANGE * PARSENAME(@EndRange ,3) + @MAXRANGE * @MAXRANGE * @MAXRANGE * PARSENAME(@EndRange ,4)
THEN 1
ELSE 0
END
END这里. I从获得上述功能
发布于 2015-04-20 06:24:15
您可以创建一个函数,使所有it都处于格式化的###.###.###.###类型中,然后可以使用它进行任何您想要的检查。
CREATE FUNCTION dbo.formatIP ( @ip varchar(20) )
RETURNS varchar(20)
AS
BEGIN
RETURN RIGHT('000'+PARSENAME(@ip,4), 3) + '.' + RIGHT('000'+PARSENAME(@ip,3), 3) + '.' + RIGHT('000'+PARSENAME(@ip,2), 3) + '.' + RIGHT('000'+PARSENAME(@ip,1), 3)
END
GO现在您可以这样使用它:
DECLARE @ip1 varchar(20) = '5.1.82.205', @from varchar(20) = '5.1.82.0', @to varchar(20) = '5.1.82.255'
SELECT
CASE
WHEN dbo.formatIP(@ip1) BETWEEN dbo.formatIP(@from) AND dbo.formatIP(@to) THEN 1
ELSE 0
END发布于 2015-04-20 13:24:08
尝试将ip地址转换为一个大整数,以便在以下范围内搜索,
declare @ips table ([fromip] varchar(15), [toip] varchar(15), country varchar(5))
insert into @ips values
('5.1.82.0' , '5.1.82.255', 'PK'),
('5.39.250.0' ,'5.39.253.255','PK'),
('5.39.255.0','5.39.255.255','PK')
declare @ip as varchar(15) ='5.1.82.250'
SELECT *
FROM @IPs
WHERE (Country = 'pk') AND
cast(right('00'+PARSENAME(@ip, 4),3)+ right('00'+PARSENAME(@ip, 3),3)+right('00'+PARSENAME(@ip, 2),3) +right('00'+PARSENAME(@ip, 1),3)
AS bigint) between
cast(right('00'+PARSENAME(fromip, 4),3)+ right('00'+PARSENAME(fromip, 3),3)+right('00'+PARSENAME(fromip, 2),3) +right('00'+PARSENAME(fromip, 1),3)
AS bigint) and
cast(right('00'+PARSENAME(toip, 4),3)+ right('00'+PARSENAME(toip, 3),3)+right('00'+PARSENAME(toip, 2),3) +right('00'+PARSENAME(toip, 1),3)
AS bigint)https://stackoverflow.com/questions/29740014
复制相似问题