我使用的是Microsoft Access 2000,需要传入一个以逗号分隔的字符串参数。逗号分隔的字符串用于where语句的IN子句。这方面的一个例子是:
SELECT * FROM Table1 WHERE Field1 IN (@MyValues)
其中@MyValues可能类似于1,2,3
但是,当我传入1,2,3
时,Access参数似乎不接受输入。 Access SQL中是否有一个很好的拆分字符串函数可以解决这个问题?或者还有另一种解决这个问题的方法吗?
关于我正在做的事情的参考,我试图在.NET中使用参数化的SQL来获得结果集。
修改 下面是一些可以调用此查询的简化.NET代码示例:
OleDbCommand cmd = new OleDbCommand("SELECT * FROM Table1 WHERE Field1 IN (@MyValues)");
cmd.Parameters.Add("@MyValues","1,2,3");
答案 0 :(得分:2)
这个怎么样:
SELECT * FROM Table1 WHERE @MyValues Like "%" & Field1 "%"
这应该检查字段中的值是否包含在@MyValues参数的子字符串中。现在,如果@MyValues中的任何单个值都是彼此的子串,这可能会有问题:
SELECT * FROM Table1 WHERE "2, 5, 10" Like "%" & Field1 "%"
在这种情况下,Field1中的“1”会匹配,但不应该匹配。因此,您可能需要格式化数字或以其他方式划分它们,例如:
SELECT * FROM Table1 WHERE " 2 5 10 " Like "% " & Field1 " %"
或者,或者:
SELECT * FROM Table1 WHERE ", 2, 5, 10," Like "%, " & Field1 ",%"
我不确定这会如何执行,但它至少会允许参数化。
答案 1 :(得分:1)
起初,你的问题看起来有点熟悉。然后它开始看起来非常熟悉。然后我意识到我不久前有同样的问题。我的解决方案是将参数投入此函数:
Public Function IsIn( _
ByVal value As Variant, _
ParamArray theset() As Variant) _
As Boolean
Dim i As Long
For i = LBound(theset) To UBound(theset)
If value = theset(i) Then
IsIn = True
Exit Function
End If
Next
End Function
在示例SQL代码中,您可以执行以下操作:
SELECT * FROM Table1 WHERE IsIn(Field1,array(1,2,3))=true;
(和你一样,我也认为像这样的程序应该已经内置到Access中。也许是在2007年或2010年。)
答案 2 :(得分:0)
你能把它们放在另一张桌子上并加入吗?
如果您不想创建另一个表,那没关系。您的ADO代码和查询语法是什么样的?
从上面编辑的代码中,我认为您不需要使用cmd对象的参数集合。只需修改您的sql以嵌入您的参数值:
OleDbCommand cmd = new OleDbCommand("SELECT * FROM Table1 WHERE Field1 IN (1,2,3)");
如果在mdb中有参数化查询,则不会使用.parameters集合。你的sql是源代码。