我有一张表,其中包含一列可以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)
);
我试过几个查询,更新计算机名称列,最有前途的是:
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场(S)由于类型转换失败......”
结果表看起来像:
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
有什么建议吗?
虽然使用下面的答案,我意识到为什么我的上述查询不起作用。即使条件为假,Access也会评估SWITCH语句中的每个可能值。因此,当没有域时,LEFT函数的长度参数是负数。
我会澄清这个问题。 comp1和1.2.0.1应位于ComputerName列中。 – mjoshawa
这是在Access中发生的。我可以为此使用一个函数(比如迭代一个记录集),但根据我的经验,Access SQL查询速度要快得多。可能会有成千上万的记录。 – mjoshawa