如何使MS Access查询参数可选?

时间:2008-09-18 20:37:49

标签: sql ms-access

我有一个查询,我想在不同的时间以不同的方式过滤。我现在通过在相关查询字段的条件字段中放置参数来完成此操作的方式,但是在许多情况下我不想在给定字段上进行过滤,而只在其他字段上进行过滤。是否有任何方法可以将某种通配符传递给criteria参数,以便我可以绕过该查询的特定调用的过滤?

6 个答案:

答案 0 :(得分:12)

如果你构建你的查询:

PARAMETERS ParamA Text ( 255 );
SELECT t.id, t.topic_id
FROM SomeTable t
WHERE t.id Like IIf(IsNull([ParamA]),"*",[ParamA])

如果未填写参数,将选择所有记录。

答案 1 :(得分:3)

请注意*带有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的ANSI查询模式的更多详细信息,请参阅About ANSI SQL query mode

答案 2 :(得分:1)

回到上一个问题的前一个例子。您的参数化查询是一个类似于以下内容的字符串:

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)

答案 3 :(得分:0)

我认为你不能。你是如何运行查询的?

我想说如果你需要一个包含那么多开放变量的查询,把它放在一个vba模块或类中,并调用它,让它每次都构建字符串。

答案 4 :(得分:0)

我不确定这会有什么帮助,因为我怀疑你想用保存的查询而不是VBA来做这件事;但是,您可以做的最简单的事情是在VBA中逐行构建查询,然后从中创建记录集。

一种非常强硬的方法是动态地重写已保存的查询然后访问它;但是,如果您有多个人使用同一个数据库,您可能会遇到冲突,并且您会让下一个开发人员感到困惑。

您还可以以编程方式将默认值传递给查询(如上一个问题所述)

答案 5 :(得分:0)

好吧,您可以通过传递*作为您不希望在当前过滤器中使用的字段的参数来返回非空值。在Access 2003(以及可能的早期版本和更高版本)中,如果使用like [paramName]作为数字,文本,日期或布尔字段的标准,则星号将显示所有记录(与您指定的其他条件匹配) )。如果您还想返回空值,则可以使用like [paramName] or Is Null作为标准,以便返回所有记录。 (如果您在代码中构建查询,这种方法效果最好。如果您使用的是现有查询,并且在有过滤值时不想返回空值,则无效。)

如果您要过滤备注字段,则必须尝试其他方法。