【发布时间】:2012-11-27 19:54:56
【问题描述】:
我有一个表格,其中有一列可 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
有什么建议吗?
在使用以下答案时,我意识到为什么上面的查询不起作用。即使条件为假,Access 也会评估 SWITCH 语句中的每个可能值。因此,LEFT 函数的长度参数在没有域时为负数。
【问题讨论】:
-
我会澄清这个问题。 comp1 和 1.2.0.1 应该在 ComputerName 列中。
-
这是在 Access 本地发生的。我可以为此使用一个函数(例如遍历记录集),但根据我的经验,Access SQL 查询要快得多。可能有成千上万条记录。
标签: sql ms-access-2007 jet-sql