在 IN 语句中使用表单中的参数

Posted

技术标签:

【中文标题】在 IN 语句中使用表单中的参数【英文标题】:Using parameter from form in IN statement 【发布时间】:2015-04-21 17:44:19 【问题描述】:

我有一个包含多个输入的表单,然后将其传递给查询。这非常简单,除了我希望在我的 sql 中的 IN 语句中使用我的参数之一,如下所示:

Select sum(id) as numobs from table where year=[form]![form1]![year] and (group in([form]![form1]![group]));

当 [form]![form1]![group]="3,4" 它查询 "group in(34)" 并且如果 [form]![form1]![group]="3, 4" 然后我收到一条错误消息,提示“此表达式键入错误,或者它太复杂而无法评估...”

我希望能够在表单的字段中输入多个用逗号分隔的数字,然后让查询在 IN 语句中使用结果。这看起来可行吗?

我知道使用 VBA 我可以做 if-then 语句来查看组数的每个可能组合(有超过 40 个组,因此组合起来有超过 4 万亿种方法可以组合 40 多个组,因为 42 的总和选择 k从 0 到 42 超过 4 万亿)所以使用 IN 语句似乎是一个更好的选择。

关于如何让 IN 语句与表单中的参数一起工作的任何想法?

谢谢

【问题讨论】:

你的意思是group in (3, 4)?我不知道 Access 是否支持多值参数,但这可能是您应该关注的。即使您最终使用 VBA,也不需要 4 万亿次测试。 accessexperts.com/blog/2013/09/23/… 链接说 in(3, 4) 是正确的不是 in (3, 4) 空间不大,大部分SQL都是用它写的。不过我担心逗号:你写了34,这可能会变成一个完全不同的问题。 这里是一些建议的方法。你也可以尝试另一种方法,用你的“组”的值填充另一个表并使用IN (select group from <mygroups>)。 support.microsoft.com/en-us/kb/210530 【参考方案1】:

我想不出使用IN 的方法。

我的解决方案:在数据库的 VBA 模块中,编写一个子程序以根据表单控件中的值构建查询。让我们使用Split 方法创建一个数组,我们可以遍历它来构建一个查询。

Sub MakeTheQuery()
Dim strSQL As String, db As DAO.Database
Set db = CurrentDb()

strSQL = "SELECT sum(id) AS numobs _
FROM table WHERE ("

Value = Forms!YourForm!YourControl.Caption
'The property may vary with controls ^

'Create an array from the control values
anArray = Split(Value, ",")

'Add to the query for each value
For i = LBound(anArray) To (UBound(anArray) - 1)
strSQL = strSQL & " ErrorKey.ID = " & anArray(i) & " OR"
Next i

'Wrap it all up
strSQL = strSQL & " ErrorKey.ID = " & anArray(UBound(anArray)) & ")"

'Assign SQL to query
db.QueryDefs!YourQuery.SQL = strSQL

End Sub

请记住,这假设表单控件中的字符串将被格式化为无空格,但您可以通过使用anArray = Split(Value, ", ") 轻松更改它(注意逗号后添加的空格)。

要将 VBA 子分配给表单上的按钮或其他控件,方法是转到 Layout View,单击控件,转到属性表上的 Event 选项卡,点击 ... 单击时旁边的按钮。点击Code Builder。将Call MakeTheQuery 放入它为您构建的子目录中。如果您也想运行查询,请输入DoCmd.OpenQuery "YourQuery"

你也可以用这个方法build a more complex, dynamic parameter query。

【讨论】:

【参考方案2】:

这可以通过 VBA 模块中的 sub 非常简单地完成:

Sub MakeTheQuery()
    Dim db As DAO.Database
    Dim strSQL As String
    Dim strElements As String

    Set db = CurrentDb()

    strSQL = "SELECT Sum(id) AS numobs " & _
        "FROM ErrorKey WHERE ErrorKey.ID In (0);"

    ' Example: "3,5"
    strElements = Forms!YourForm!YourControl.Caption

    ' Assign SQL to query
    db.QueryDefs!YourQuery.SQL = Replace(strSQL, "0", strElements)

End Sub

【讨论】:

我将如何实现这个?我将此代码输入到表单的模块中,但是如何调用/使用它?谢谢 嗨@Carl 我已经用一些实现细节编辑了这个问题。你只需要运行这个子来改变查询(Call MakeTheQuery)然后run the query。确保你也替换了所有事物的名称。 @Carl 我试图编辑上面的答案,因为它更精简,但我的编辑被拒绝了。我在答案中添加了实施信息。 @st78:请阅读问题并再次回答。该值是从用户无法控制的 Caption 属性中提取的。【参考方案3】:

您可以考虑使用 Instr() 函数而不是 In。假设您是按程序生成编号列表,而不是强制最终用户键入逗号分隔的列表,您可以更改格式。我们通常使用管道分隔符,例如,输入可能如下所示: [form]![form1]![group]="|3|4|" 这作为单个字符串参数传递给查询,并在 Instr() 函数中进行测试,如下所示: Instr([form]![form1]![group],"|" & group & "|")>0 ' Instr() returns a numeric value of the position in the first argument where the second argument is found. 管道确保我们不会得到误报(例如,当我们通过 34 时找到 3)。我们将它与多选列表框和自定义 VBA 函数一起使用,但只要您可以控制格式,它就完全可行。 Instr Function - support.office.com

【讨论】:

以上是关于在 IN 语句中使用表单中的参数的主要内容,如果未能解决你的问题,请参考以下文章

使用 MySql、PHP 和 ADODB 在准备好的语句中参数化 IN 子句

如何将 select 语句的 IN 子句中的参数作为具有多个值的参数传递?

mybatis中的查询语句in用法的相关问题

SQL Server参数化SQL语句中的like和in查询的语法(C#)

SQL Server参数化SQL语句中的like和in查询的语法(C#)

SQL Server参数化SQL语句中的like和in查询的语法(C#)