I have a query that I would like to filter in different ways at different times. The way I have done this right now by placing parameters in the criteria field of the relevant query fields, however there are many cases in which I do not want to filter on a given field but only on the other fields. Is there any way in which a wildcard of some sort can be passed to the criteria parameter so that I can bypass the filtering for that particular call of the query?
6 回答
如果您像这样构建查询:
PARAMETERS ParamA Text ( 255 );
SELECT t.id, t.topic_id
FROM SomeTable t
WHERE t.id Like IIf(IsNull([ParamA]),"*",[ParamA])
如果不填写参数,将选择所有记录。
请注意,*
带有关键字的通配符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 to 2003) 和 ACE (Access2007) 中对此进行了测试,并且工作正常。我之前已在新闻组中发布过此内容,并获得了 Access MVP 的批准。通常我自己会避开未记录的功能,但在这种情况下例外,因为 Jet 已被弃用近十年,并且保持它活着的 Access 团队似乎对对引擎进行深度更改(或错误修复! ),这具有使喷气发动机成为非常稳定的产品的效果。
有关 Jet 的 ANSI 查询模式的更多详细信息,请参阅关于 ANSI SQL 查询模式。
回到你之前的问题中我之前的例子。您的参数化查询是一个看起来像这样的字符串:
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)
我不认为你可以。你是如何运行查询的?
我会说,如果您需要一个具有这么多开放变量的查询,请将其放入 vba 模块或类中,然后调用它,让它每次都构建字符串。
我不确定这是否有帮助,因为我怀疑您想使用保存的查询而不是 VBA 来执行此操作;但是,您可以做的最简单的事情是在 VBA 中逐行构建查询,然后从中创建记录集。
一种非常老套的方法是动态重写保存的查询,然后访问它;但是,如果您有多个人使用同一个数据库,您可能会遇到冲突,并且您会混淆下一个开发人员。
您还可以以编程方式将默认值传递给查询(如您在上一个问题中所讨论的)
好吧,您可以通过传递 * 作为您不希望在当前过滤器中使用的字段的参数来返回非空值。在 Access 2003(以及可能的更早和更高版本)中,如果您使用like [paramName]
数字、文本、日期或布尔字段作为标准,星号将显示所有记录(与您指定的其他标准匹配)。如果您也想返回空值,那么您可以使用like [paramName] or Is Null
作为标准,以便它返回所有记录。(如果您在代码中构建查询,这最有效。如果您使用现有查询,并且您不想在有过滤值时返回空值,这将不起作用。)
如果您要过滤备忘录字段,则必须尝试另一种方法。