具有各种多值参数的 MS Query,其中可以有一个空参数

Posted

技术标签:

【中文标题】具有各种多值参数的 MS Query,其中可以有一个空参数【英文标题】:MS Query with various multiple value parameters where there can be an empty parameter 【发布时间】:2013-12-03 14:56:44 【问题描述】:

我在 Excel 中有 5 个多选列表框。每个列表框的选中内容分别写在一个单元格中,用逗号分隔。

例如在单元格 A1 中所有选定的名称:Tim、Miranda、Laura

这些单元格是 Access 查询(where 子句)的条件。

我打开 MS Query 并将以下 where 子句添加到查询并定义参数:

Where (Instr(?, [name])>0 And Instr(?, [number])>0 And Instr(?, [city])>0 And Instr(?, [phone])>0 And Instr(?, [email])>0) 

效果很好,但是如果其中一个参数字段为空(例如用户没有选择任何城市)查询返回所有行,其中city 是空的,而不是在这种情况下忽略该子句。

我该如何解决这个问题?也许还有另一种使用 VBA 和动态 SQL 的解决方案。

注意:我必须将 Excel 用于列表框而不是 Access 公式,因为该工具也应由无权访问数据库的人使用。

【问题讨论】:

【参考方案1】:

我会使用 LIKE 运算符。 在 Excel 中填充其他单元格并将参数指向它们

=if(<cityCell> ="","_%",<cityCell>&"%")

并将查询更改为

Where [name] like ? And [number] like ? And[CITY] like and [phone] like ? And [email]like ?

通过这种方式,您可以处理用户的其他违规行为,即将 Excel 公式更改为

=if(<cityCell> ="","_%",PROPER(<cityCell>)&"%")

因此,toronto 的用户条目将查找 Toronto。我在 UPPER 中经常使用它,因为很多数据库都包含大写条目.. 即加拿大邮政编码

【讨论】:

【参考方案2】:

根据我的经验,在某些情况下它可能会返回 null 并影响您在子句中的比较。

当你尝试 len 函数时会发生什么:

    Where Instr(?, [name])>0 And Instr(?, [number])>0 And (Instr(?, [number])>0 and 
NOT ISNULL([CITY])) And Instr(?, [phone])>0 And Instr(?, [email])>0)**

请参阅上面的代码更改。抱歉,看到你的更新,我只需要解决这个问题。你想要所有的记录,包括那些有“空”城市的记录吗?但我以为你想让它跳过那些?我搜索的另一种方法是 - NOT ISNULL([CITY]) 。我在一个有很多 Access 数据库的环境中工作,而且它们很古怪!

【讨论】:

我认为问题在于 where 条件。我猜她试图找到姓名、号码、电话、电子邮件与条件匹配的所有记录(即[city] equal Vancouver,但如果没有为特定列选择条件,则应该忽略它。这是我的猜测......跨度> 如果我的解释正确,那么 OR 运算符会更合适,但你可以这样做:OR (Instr(?, [CITY])>0 and NOT ISNULL([CITY ]))【参考方案3】:

我通过在 VBA 中使用动态 SQL 解决了这个问题。如果未选择任何内容,我会将列表框中的所有行链接到一个字符串。这是一个包含名称的列表框的示例(代码不包含与数据库的必要连接):

Dim string1 As String
Dim rngParams As Range, rngCell As Range
Dim i As Long

'String name
  With Worksheets("Table1")
    For i = 0 to .ListBox1.ListCount - 1
        If .ListBox1.Selected(i) Then
        If string1 = "" Then string1 = "("
            string1 = string1 & "'" & .ListBox1.List(i) & "',"
        End If

    Next i
End With

If string1 <> "" Then
    string1 = Left(string1, Len(string1) - 1)
    string1 = string1 & ")"
End If

'If nothing is selected, use all names and write them into one string
 If string1 = "" Then
    string1 = "("
    With Worksheets("table2")
        Set rngParams = .Range("allNames")
        For Each rngCell In rngParams.Cells
            string1 = string1 & "'" & rngCell.Value & "',"
        Next rngCell
        string1 = Left(string1, Len(string1) - 1)
        string1 = string1 & ")"
    End With
 End If

strSQL = "SELECT Name FROM accesstable WHERE Name IN " & string1 

【讨论】:

以上是关于具有各种多值参数的 MS Query,其中可以有一个空参数的主要内容,如果未能解决你的问题,请参考以下文章

MS Access 中多值字段的替代方案

s-s-rS 多值参数

通过 vba ms 访问将多值列的数据绑定到组合框中

如何在多值参数上放置过滤器以不显示下拉列表中的所有值

s-s-rS 中的可选多值参数

具有多值参数的存储过程表现奇怪