在MS Access中,我尝试按第3和第4个八位字节对IP进行排序,然后在各自的列中将它们整理为[IpAddress]和[HostName]。第三个八位字节将链接到服务器机架。例如。 1,22或121和第4个八位字节将链接到其在机架中的位置。例如。 s1,s22或s121。因此,IP将从列表和查询中排序,以构建IP的HostName。怎么可能/我应该这样做呢。我对MS访问不是很熟悉。我尝试过使用iif语句,但我无法获得理想的结果。我想HostName遵循这个命名法:121s1。感谢您的帮助。
SELECT IIf(query1.Ipaddress Like '*.*.3.#', "1003s'#'", 22) AS HostName
FROM Query1;
这是我尝试使用的那一行。但是,它只会产生一个引号大约为1003a'#'的输出。如果我周围没有“”,它将在查询表达式IIf中返回“语法错误(缺少运算符)”(query1.Ipaddress Like'。 .3。#',1003a'#',22 )。引号中的内容与引号中的内容完全相同(1003a'#')。22只是一个占位符,所以我可以回复访问。也许这对我要求的内容有帮助。
答案 0 :(得分:0)
正如@WEI_DBA在对问题的评论中建议的那样,请考虑更改存储IP地址的方式。而不是单个字符串
IpAddress
----------
10.0.121.1
10.0.12.34
你可以将它们存储为四个独立的整数
IpOctet1 IpOctet2 IpOctet3 IpOctet4
-------- -------- -------- --------
10 0 121 1
10 0 12 34
然后你可以简单地将HostName派生为
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