首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >查询SQL Server中的IP地址匹配

查询SQL Server中的IP地址匹配
EN

Stack Overflow用户
提问于 2015-04-20 05:39:19
回答 4查看 6K关注 0票数 0

我正在努力匹配IP地址。输入IP地址可以是"5.1.82.1“。

因此,我将输入IP地址的第一部分与数据库中以5开头的所有IP地址进行匹配。我的查询如下所示

代码语言:javascript
复制
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语句中。

更新

样本数据

代码语言:javascript
复制
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.05.1.82.255

EN

回答 4

Stack Overflow用户

发布于 2015-04-20 06:19:16

对于相同的thing.Try,我使用了以下函数--它也适用于您。

它验证用户的IP地址是否在IP地址的范围内。下面的脚本将返回1,如果IP地址在范围之间,否则返回0;

代码语言:javascript
复制
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从获得上述功能

票数 0
EN

Stack Overflow用户

发布于 2015-04-20 06:24:15

您可以创建一个函数,使所有it都处于格式化的###.###.###.###类型中,然后可以使用它进行任何您想要的检查。

代码语言:javascript
复制
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

现在您可以这样使用它:

代码语言:javascript
复制
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
票数 0
EN

Stack Overflow用户

发布于 2015-04-20 13:24:08

尝试将ip地址转换为一个大整数,以便在以下范围内搜索,

代码语言:javascript
复制
    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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29740014

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档