如何使MS Access查询参数为可选?
我有一个查询,希望在不同的时间以不同的方式进行过滤。我现在通过在相关查询字段的条件字段中放置参数来完成此操作的方式,但是在很多情况下,我不想在给定字段上进行过滤,而只在其他字段上进行过滤。有什么方法可以将某种通配符传递给criterias参数,以便我可以绕过该查询的特定调用的过滤?
解决方案
我不认为你可以。我们如何运行查询?
我想说的是,如果我们需要一个具有这么多开放变量的查询,请将其放在vba模块或者类中,然后调用它,让它每次都构建字符串。
我不确定这是否有帮助,因为我怀疑我们想通过保存的查询而不是在VBA中执行此操作;但是,最简单的方法是在VBA中逐行建立查询,然后从中创建一个记录集。
一种非常骇人听闻的方法是即时重写保存的查询,然后访问它。但是,如果有多个人使用同一数据库,则可能会发生冲突,并且会使下一个开发人员感到困惑。
我们还可以以编程方式将默认值传递给查询(如我们在上一个问题中所讨论的)
好吧,我们可以通过传递*作为不希望在当前过滤器中使用的字段的参数来返回非空值。在Access 2003(以及可能的较早版本和更高版本)中,如果我们使用" like [paramName]"作为数字,文本,日期或者布尔值字段的条件,则星号将显示所有记录(与我们符合其他条件的记录指定)。如果还想返回空值,则可以使用" like [paramName]或者Is Null"作为条件,以便它返回所有记录。 (如果我们正在代码中构建查询,这将是最好的选择。如果我们使用的是现有查询,并且我们不想在有过滤值时返回空值,则此方法将无效。)
如果要过滤"备注"字段,则必须尝试另一种方法。
如果我们像这样构造查询:
PARAMETERS ParamA Text ( 255 ); SELECT t.id, t.topic_id FROM SomeTable t WHERE t.id Like IIf(IsNull([ParamA]),"*",[ParamA])
如果未填写该参数,将选择所有记录。
回到我以前的问题中。参数化查询是一个看起来像这样的字符串:
qr = "Select Tbl_Country.* From Tbl_Country WHERE id_Country = [fid_country]"
根据fid_Country的性质(数字,文本,guid,日期等),我们必须将其替换为小丑值和特定的定界字符:
qr = replace(qr,"[fid_country]","""*""")
为了完全允许通配符,原始查询也可以是:
qr = "Select Tbl_Country.* From Tbl_Country _ WHERE id_Country LIKE [fid_country]"
然后,我们可以获取fid_Country的通配符值,例如
qr = replace(qr,"[fid_country]","G*")
完成此操作后,我们可以使用字符串打开记录集
set rs = currentDb.openRecordset(qr)
请注意,带有LIKE
关键字的*
通配符仅在ANSI-89查询模式下具有所需的效果。
许多人错误地认为Access / Jet中的通配符始终为*。不是这样Jet有两个通配符:在ANSI-92查询模式下为%,在ANSI-89查询模式下为*。
ADO始终是ANSI-92,而DAO始终是ANSI-89,但是Access接口可以是任一接口。
在数据库对象中使用LIKE关键字(即将保留在mdb文件中的东西)时,我们应该对自己进行思考:如果有人使用查询模式而不是我通常使用的查询模式来使用该数据库,将会发生什么?假设我们只想将文本字段限制为数字字符,并且我们编写的验证规则是这样的:
NOT LIKE "*[!0-9]*"
如果有人不经意地(或者以其他方式)通过ADO连接到.mdb,则上述验证规则将允许他们添加具有非数字字符的数据,并且将破坏数据完整性。不好。
更好的IMO始终为两种ANSI查询模式编码。也许最好通过对两种模式进行显式编码来最好地实现,例如
NOT LIKE "*[!0-9]*" AND NOT LIKE "%[!0-9]%"
但是随着Jet SQL DML / DDL的介入,要实现这个目标非常困难。这就是为什么我建议使用ALIKE关键字的原因,该关键字使用ANSI-92查询模式通配符,而与查询模式无关,例如
NOT ALIKE "%[!0-9]%"
注意ALIKE没有记录(并且我认为这就是为什么我的原始帖子被打掉的原因)。我已经在Jet 3.51(Access97),Jet 4.0(Access2000到2003)和ACE(Access2007)中进行了测试,并且工作正常。我以前已在新闻组中发布了此内容,并获得了Access MVP的批准。通常,我自己会避免未记录的功能,但在这种情况下会例外,因为Jet已被弃用了将近十年,而使它存活的Access团队似乎并不希望对引擎进行重大更改(或者修正错误! ),从而使Jet引擎成为非常稳定的产品。
有关Jet的ANSI查询模式的更多详细信息,请参阅关于ANSI SQL查询模式。