首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使MS Access查询参数成为可选的?

如何使MS Access查询参数成为可选的?
EN

Stack Overflow用户
提问于 2008-09-18 20:37:49
回答 6查看 23.6K关注 0票数 3

我有一个查询,我想在不同的时间以不同的方式进行过滤。我现在已经通过在相关查询字段的criteria字段中放置参数来实现这一点,但是在许多情况下,我不想对给定的字段进行过滤,而只想对其他字段进行过滤。有没有什么方法可以将某种类型的通配符传递给criteria参数,这样我就可以绕过对查询的特定调用的过滤?

EN

回答 6

Stack Overflow用户

发布于 2008-09-18 21:06:39

如果你这样构造你的查询:

代码语言:javascript
运行
复制
PARAMETERS ParamA Text ( 255 );
SELECT t.id, t.topic_id
FROM SomeTable t
WHERE t.id Like IIf(IsNull([ParamA]),"*",[ParamA])

如果未填写该参数,则所有记录将被选中。

票数 12
EN

Stack Overflow用户

发布于 2008-09-29 13:18:06

注带有LIKE关键字的ANSI通配符仅在* -89查询模式下具有所需的效果。

许多人错误地认为Access/Jet中的通配符总是*。事实并非如此。Jet有两个通配符: ANSI-92查询模式下的%和ANSI-89查询模式下的*。

ADO始终为ANSI-92,DAO始终为ANSI-89,但访问接口可以是二者之一。

当在数据库对象中使用LIKE关键字(例如,将持久保存在mdb文件中的内容)时,您应该考虑:如果有人使用查询模式而不是我自己通常使用的查询模式来使用此数据库,会发生什么?假设您想要将文本字段限制为仅限数字字符,并且您的验证规则编写如下:

代码语言:javascript
运行
复制
NOT LIKE "*[!0-9]*"

如果有人无意中(或以其他方式)通过ADO连接到您的.mdb,那么上面的验证规则将允许他们添加包含非数字字符的数据,您的数据完整性将会失效。不太好。

最好是始终为两种ANSI查询模式编写代码。也许这最好通过对两种模式进行显式编码来实现,例如

代码语言:javascript
运行
复制
NOT LIKE "*[!0-9]*" AND NOT LIKE "%[!0-9]%"

但是随着Jet SQL DML/DDL越来越复杂,这可能很难简明扼要地实现。这就是为什么我建议使用ALIKE关键字,它使用ANSI-92查询模式通配符,而不考虑查询模式。

代码语言:javascript
运行
复制
NOT ALIKE "%[!0-9]%"

类似的笔记是没有记录的(我想这就是为什么我的原始帖子被标记下来的原因)。我已经在Jet3.51 (Access97)、Jet4.0 (Access2000到2003)和ACE (Access2007)上测试过了,它工作得很好。我之前已经在新闻组中发布了这篇文章,并获得了Access MVP的批准。通常情况下,我自己会避开没有文档记录的功能,但在这种情况下例外,因为Jet已经被弃用了近十年,而让它继续存在的访问团队似乎对对引擎进行深层次的更改(或错误修复!)不感兴趣,这会使Jet引擎成为一个非常稳定的产品。

有关Jet的ANSI查询模式的详细信息,请参阅About ANSI SQL query mode

票数 3
EN

Stack Overflow用户

发布于 2008-09-19 06:39:52

回到你上一个问题中的前一个例子。您的参数化查询是如下所示的字符串:

代码语言:javascript
运行
复制
qr = "Select Tbl_Country.* From Tbl_Country WHERE id_Country = [fid_country]"

根据fid_Country的性质(数字、文本、guid、日期等),您必须将其替换为一个搞笑器值和特定的分隔字符:

代码语言:javascript
运行
复制
qr = replace(qr,"[fid_country]","""*""")

为了完全允许通配符,您的原始查询也可以是:

代码语言:javascript
运行
复制
qr = "Select Tbl_Country.* From Tbl_Country _
      WHERE id_Country LIKE [fid_country]"

然后,您可以获得fid_Country的通配符值,例如

代码语言:javascript
运行
复制
qr = replace(qr,"[fid_country]","G*")

完成此操作后,即可使用该字符串打开记录集

代码语言:javascript
运行
复制
set rs = currentDb.openRecordset(qr)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/96661

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档