【发布时间】:2015-06-26 17:07:59
【问题描述】:
我正在尝试匹配 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
【问题讨论】:
-
显示一些虚拟数据。仅凭描述很难弄清楚
-
一般IP地址以字符串形式存储在dadatbase中,您可以比较整个IP地址,如ipaddress = "5.1.82.1"。此外,您可以在 ipaddress 上实现索引以获得更快的响应。
-
@KishorPawar 在 db 中有范围但不准确的 IP 地址
-
如果您将 IP 地址保存在数据库中,以便每个八位字节左填充零到三位数(即“005.001.082.000”),那么您可以简单地使用 BETWEEN 运算符。
-
更好的方法是将 IP 地址存储为 4 个不同的 tinyint 列。这将提供更小的存储空间和更快的性能(特别是如果 IP 将作为 4 个 tinyint 参数而不是字符串传递给数据库。
标签: sql-server sql-server-2008 tsql sql-server-2012 ip