如何在查询中插入值列表作为 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]![t3])) 查询结果为空。 为什么?
(当我执行 ?TempVars("t3") it returns 2,3 - 当我然后 copy/paste 该行进入查询所以它读取 WHERE (tbl1.ID In (2,3)) it returns 条目2 和 3...)


需要考虑的事项:

为什么 很容易回答。如果 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)