MS Access LIKE表达式用作MS Excel数据源时出现问题



我创建了一个MS Access 2013查询,在该查询中我有一个使用LIKE运算符的表达式。然后,我创建了一个Excel 2013工作簿,选择此Access数据库作为数据源,并选择包含LIKE表达式的查询。问题是,当将数据返回到excel时,它似乎不喜欢like表达式。从Access内部运行查询时,它会显示正确的结果。

所以如果我有一个像的表达式

iif([CAR] like "*A*", True,False)

当在Access中运行查询时,它将返回表中的所有CAR,并根据CAR字段中的字符串显示true或false。但是,当将此查询设置为Excel数据源时,它只返回导致错误的结果(CAR字段字符串中没有A)

我知道Excel不使用LIKE运算符,但我认为Access中的查询会产生结果,而Excel只是使用结果。

如果你需要澄清这个问题,请在评论中提问。

在Access SQL-89模式中,*被用作通配符,以匹配任何零个或多个字符的序列。SQL-89模式是查询设计器和从DAO运行的查询的Access默认模式。

但Access也支持SQL-92模式,该模式使用%而不是*作为通配符。如果您使用ADO从Excel运行查询,那么它使用的是SQL-92模式。

为了在Excel中获得预期的结果,你至少可以做3件事:

  1. IIf([CAR] Like "%A%", True,False)-在查询中使用此表达式可以在Excel中获得预期结果。不利的一面是,在Access会话中运行查询时,可能看不到相同的结果。

  2. IIf([CAR] ALike "%A%", True,False)-Alike(而不是Like)向数据库引擎发出信号,要求%而不是*作为通配符,无论查询是从SQL-89还是92模式运行。因此,这个表达式应该在Access和Excel中都给出相同的结果。

  3. IIf(InStr(1, [CAR], "A", 1) > 0, True, False)-InStr不依赖于通配符,因此应该在Access和Excel中都能得到相同的结果。

我假设您已经尝试在搜索所有至少有一个字母'A'的汽车时使用WHERE子句。

如果是这种情况,我找到的解决方案是在WHERE子句中同时使用'*''%'。这样,查询将在MS AccessExcel中运行。

例如,当您想要获取字母为'A'的所有汽车时,请使用以下查询:

   SELECT * FROM <Table>
    WHERE CAR LIKE "*A*" OR CAR LIKE "%A%";

并且,当您想要获得没有字母'A'的所有汽车时,请使用以下查询:

   SELECT * FROM <Table>
    WHERE NOT CAR LIKE "*A*" AND NOT CAR LIKE "%A%";

这样,当您在MS Access中执行查询时,就会使用WHERE子句的LIKE "*A*"部分。

另一方面,当从Excel运行它时,会评估LIKE "%A%"部分。

在这两种情况下,WHERE子句的另一部分对于所有行都返回true。

最新更新