在 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 子句中的参数作为具有多个值的参数传递?
SQL Server参数化SQL语句中的like和in查询的语法(C#)