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

时间:2013-12-03 14:56:44

标签: sql excel vba ms-access-2007 ms-query

我在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公式,因为该工具也应该由无权访问数据库的人使用。

3 个答案:

答案 0 :(得分:0)

根据我的经验,它可能在某些情况下返回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数据库的环境中工作,它们很古怪!

答案 1 :(得分:0)

我在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 

答案 2 :(得分:0)

我将使用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>)&"%")

因此,多伦多的用户输入将查找多伦多。我在UPPER中经常使用此功能,因为很多数据库都包含大写字母条目。即加拿大邮政编码