我正在尝试匹配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地址第二部分的顶部记录。
所以我会对第3部分和第4部分做同样的事情。但问题是我该怎么办呢?我想我需要使用子查询。但是我会把它放在我的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
答案 0 :(得分:0)
我使用了以下功能来做同样的事情。试试吧,它也适合你。
验证用户的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
我从HERE获得了以上功能。
答案 1 :(得分:0)
您可以创建一个函数,使所有IP都采用格式化的###.###.###.###
类型,然后您可以将它用于任何您想要的检查
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
答案 2 :(得分:0)
尝试通过将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)
答案 3 :(得分:-3)
<?php
$st = '5.1.82.1';
echo strstr($st, '.1.82.1',true)
?>