在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