选择 IP 中的第 3 个和第 4 个八位字节并为其分配主机名



在MS Access中,我尝试按第3和第4个八位字节对IP进行排序,然后在各自的列中将它们排序为[IpAddress]和[HostName]。第三个八位字节将链接到服务器机架。例如,1、22 或 121 和第 4 个八位字节将链接到其在机架中的位置。例如 s1、s22 或 s121。因此,IP 将从列表和查询中排序,以根据 IP 构建主机名。我怎么能/应该这样做。我对 MS 访问不是很有经验。我尝试使用 iif 语句,但无法获得预期的结果。我希望主机名遵循以下命名法:121s1。感谢您的所有帮助。

SELECT IIf(query1.Ipaddress Like '*.*.3.#', "1003s'#'", 22) AS HostName
FROM Query1;

这是我尝试使用的行。但是,它只会产生引号在 1003a'#' 左右的输出。如果我周围没有",它将在查询表达式 IIf(query1.像">..3.#', 1003a'#', 22(.用引号,它准确地输入了引号(1003a'#'(中的内容。22 只是一个占位符,所以我可以在访问中回答。也许这将有助于满足我的要求。

正如@WEI_DBA在问题的评论中所建议的那样,请考虑更改存储 IP 地址的方式。而不是单个字符串

IpAddress
----------
10.0.121.1
10.0.12.34

您可以将它们存储为四个单独的整数

IpOctet1  IpOctet2  IpOctet3  IpOctet4
--------  --------  --------  --------
10         0       121         1
10         0        12        34

然后,您可以简单地将主机名派生

IpOctet3 & "s" & IpOctet4

如果你想要旧的表示法来显示目的,你可以使用

IpOctet1 & "." & IpOctet2 & "." & IpOctet3 & "." & IpOctet4

将4 个新的Integer列添加到表中后,您可以使用 VBA 代码填充它们,如下所示:

Option Compare Database
Option Explicit
Sub SplitIpAddresses()
Dim cdb As DAO.Database
Set cdb = CurrentDb
Dim rst As DAO.Recordset
Set rst = cdb.OpenRecordset("SELECT * FROM Table1 WHERE IpAddress IS NOT NULL", dbOpenDynaset)
Do While Not rst.EOF
Dim octets As Variant
octets = Split(rst!IpAddress, ".")
rst.Edit
rst!IpOctet1 = octets(0)
rst!IpOctet2 = octets(1)
rst!IpOctet3 = octets(2)
rst!IpOctet4 = octets(3)
rst.Update
rst.MoveNext
Loop
rst.Close
End Sub

最新更新