我有一个表,其中有一列可ping的计算机名称,作为一个较大表的一部分提供给我。计算机名称可以包含虚线域名和/或IP地址。我需要将计算机名和域名分离到各自的列中。
例如:
ComputerFullName | ComputerName | Domain
comp1 | |
1.2.0.1 | |
comp3.place.com | |
1.2.1.45.place.com | |
我可以使用以下查询填写域名:
UPDATE Example
SET Domain = SWITCH(
ComputerFullName LIKE '#*.#*.#*.#*.*', MID(ComputerFullName, INSTR(1, REPLACE(ComputerFullName, '.', ' ', 1, 3), '.') + 1)
, ComputerFullName LIKE '#*.#*.#*.#*', NULL
, INSTR(1, ComputerFullName, '.') <> 0, MID(ComputerFullName, INSTR(1, ComputerFullName, '.') + 1)
);
我尝试了几个查询来更新ComputerName列,最有希望的是:
UPDATE Example
SET ComputerName = SWITCH(
ComputerFullName LIKE '#*.#*.#*.#*.*', LEFT(ComputerFullName, INSTR(1, ComputerFullName, Domain) - 2)
, ComputerFullName LIKE '#*.#*.#*.#*', ComputerFullName
, INSTR(1, ComputerFullName, '.') <> 0, LEFT(ComputerFullName, INSTR(1, ComputerFullName, '.') - 1)
, TRUE, ComputerFullName
);
这一次和其他每次尝试都返回一个错误,称"Microsoft Office Access无法更新更新查询中的所有记录…由于类型转换失败,Access没有更新2个字段…">
生成的表格如下所示:
ComputerFullName | ComputerName | Domain
comp1 | |
1.2.0.1 | |
comp3.place.com | comp3 | place.com
1.2.1.45.place.com | 1.2.1.45 | place.com
我想要的桌子是:
ComputerFullName | ComputerName | Domain
comp1 | comp1 |
1.2.0.1 | 1.2.0.1 |
comp3.place.com | comp3 | place.com
1.2.1.45.place.com | 1.2.1.45 | place.com
有什么建议吗?
在处理下面的答案时,我意识到为什么上面的查询不起作用。即使条件为false,Access也会评估SWITCH语句中的每个可能值。因此,当没有域时,LEFT函数的长度参数是负数。
我认为@HansUp所指的是从查询中调用一个函数来拆分名称。试试这个功能:
Function SplitName(ByRef CFN As String, PartWanted As Integer) As String
Dim CFN2 As String
Dim I As Integer
CFN2 = Replace(CFN, ".", "")
If IsNumeric(CFN2) Then 'assume it's an IP address
CFN = CFN & "|"
Else
Select Case Len(CFN) - Len(CFN2) 'we count the dots
Case Is > 1 'at least 2 dots means computer & domain names
I = InStrRev(CFN, ".")
I = InStrRev(CFN, ".", I - 1)
Mid(CFN, I) = "|"
Case Is = 1 ' 1 dot means domain name only
CFN = "|" & CFN
Case Else '0 dots means computer name only
CFN = CFN & "|"
End Select
End If
SplitName = Split(CFN, "|")(PartWanted)
End Function
PartWanted参数可以是0(用于获取计算机名)或1(用于获取域名)。所以你的查询看起来像:
UPDATE Example
SET Computername = SplitName([ComputerFullName],0), Domain = SplitName([ComputerFullName],1);
这跑得很快。我测试了它,用了13秒调用了这个函数200万次(这不包括实际的更新,只包括调用)。