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

时间:2017-07-26 14:20:36

标签: sql ms-access

在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只是一个占位符,所以我可以回复访问。也许这对我要求的内容有帮助。

1 个答案:

答案 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