如何在查询中插入值列表作为 IN(list) 条件?
How to insert a list of values as an IN(list) criterion in a query?
考虑如下 table
CREATE TABLE tbl1(
id INTEGER PRIMARY KEY,
someVal INTEGER
);
填充了一些数据(只是不想查询空table)和如下查询
SELECT tbl1.ID, tbl1.someVal
FROM tbl1
WHERE (tbl1.ID In ([TempVar]![t1]));
TempVars 集合已填充内容
TempVars.Add "t1", 1
TempVars.Add "t2", "2"
TempVars.Add "t3", "2,3"
通过直接 window.
现在,当查看不同 WHERE
子句的查询结果时,以下情况有效(意味着它们显示预期结果):
- 正在查询
WHERE (tbl1.ID In ([TempVar]![t1]))
returns 带有 id = 1
的条目
- 正在查询
WHERE (tbl1.ID In ([TempVar]![t2]))
returns 带有 id = 2
的条目
到目前为止,一切如预期。但是对于 WHERE (tbl1.ID In ([TempVar]![t3]))
查询结果为空。 为什么?
(当我执行 ?TempVars("t3")
it returns 2,3
- 当我然后 copy/paste 该行进入查询所以它读取 WHERE (tbl1.ID In (2,3))
it returns 条目2 和 3...)
需要考虑的事项:
- 我使用的是德语版的 Access 2013,这意味着您对
TempVars
集合的名称可能不同(对我来说,在 VBE 中它被称为 TempVars
,而查询设计只允许通过 [TempVar]
). 访问
- 此外,当在查询设计模式下手动将列表输入条件字段时,我需要用分号分隔它们,而在 SQL 模式下我需要使用逗号。愚蠢的语言差异。 (无论我用分号还是逗号定义
TempVars("t3")
都不会改变零结果的任何内容,但是...)
- 我的研究表明,上面提出的方法 应该 有效,所以我假设我实施错误或有其他因素在起作用。
- 我的方法不一定与
TempVars
的用法相关联。在表单上试验文本框和标签控件的值时,我遇到了同样的问题。
为什么 很容易回答。如果 TempVars("t3")
包含一个字符串 "2, 3"
,它只会匹配您的 ID 是等于 "2, 3"
的字符串的条目。您不能按照您的方式动态构建 IN 标准,因为 ,
不能存储在变量中,它必须存在于 SQL.
中
要解决此问题,您可以使用用户定义的函数为您执行 IN
检查。只要您不动态更改 SQL.
,就没有其他可靠的解决方法
示例 UDF:
Public Function SplitIn(commaseparatedlist As String, compare As Variant) As Boolean
Dim strInArr() As String
strInArr = Split(commaseparatedlist, ",")
Dim arrItem As Variant
For Each arrItem In strInArr
If arrItem = CStr(Nz(compare, "")) Then
SplitIn = True
Exit Function
End If
Next arrItem
SplitIn = False
End Function
用法:
WHERE SplitIn([TempVar]![t3], tbl1.ID)
考虑如下 table
CREATE TABLE tbl1(
id INTEGER PRIMARY KEY,
someVal INTEGER
);
填充了一些数据(只是不想查询空table)和如下查询
SELECT tbl1.ID, tbl1.someVal
FROM tbl1
WHERE (tbl1.ID In ([TempVar]![t1]));
TempVars 集合已填充内容
TempVars.Add "t1", 1
TempVars.Add "t2", "2"
TempVars.Add "t3", "2,3"
通过直接 window.
现在,当查看不同 WHERE
子句的查询结果时,以下情况有效(意味着它们显示预期结果):
- 正在查询
WHERE (tbl1.ID In ([TempVar]![t1]))
returns 带有id = 1
的条目
- 正在查询
WHERE (tbl1.ID In ([TempVar]![t2]))
returns 带有id = 2
的条目
到目前为止,一切如预期。但是对于 WHERE (tbl1.ID In ([TempVar]![t3]))
查询结果为空。 为什么?
(当我执行 ?TempVars("t3")
it returns 2,3
- 当我然后 copy/paste 该行进入查询所以它读取 WHERE (tbl1.ID In (2,3))
it returns 条目2 和 3...)
需要考虑的事项:
- 我使用的是德语版的 Access 2013,这意味着您对
TempVars
集合的名称可能不同(对我来说,在 VBE 中它被称为TempVars
,而查询设计只允许通过[TempVar]
). 访问
- 此外,当在查询设计模式下手动将列表输入条件字段时,我需要用分号分隔它们,而在 SQL 模式下我需要使用逗号。愚蠢的语言差异。 (无论我用分号还是逗号定义
TempVars("t3")
都不会改变零结果的任何内容,但是...) - 我的研究表明,上面提出的方法 应该 有效,所以我假设我实施错误或有其他因素在起作用。
- 我的方法不一定与
TempVars
的用法相关联。在表单上试验文本框和标签控件的值时,我遇到了同样的问题。
为什么 很容易回答。如果 TempVars("t3")
包含一个字符串 "2, 3"
,它只会匹配您的 ID 是等于 "2, 3"
的字符串的条目。您不能按照您的方式动态构建 IN 标准,因为 ,
不能存储在变量中,它必须存在于 SQL.
要解决此问题,您可以使用用户定义的函数为您执行 IN
检查。只要您不动态更改 SQL.
示例 UDF:
Public Function SplitIn(commaseparatedlist As String, compare As Variant) As Boolean
Dim strInArr() As String
strInArr = Split(commaseparatedlist, ",")
Dim arrItem As Variant
For Each arrItem In strInArr
If arrItem = CStr(Nz(compare, "")) Then
SplitIn = True
Exit Function
End If
Next arrItem
SplitIn = False
End Function
用法:
WHERE SplitIn([TempVar]![t3], tbl1.ID)