使用“IN”命令将数组作为要在 SQL 查询中使用的参数传递
Posted
技术标签:
【中文标题】使用“IN”命令将数组作为要在 SQL 查询中使用的参数传递【英文标题】:passing an Array as a Parameter to be used in a SQL Query using the "IN" Command 【发布时间】:2013-08-29 20:47:45 【问题描述】:大家下午好,
我有一个关于 SQL 查询的问题。是否可以使用“IN”命令将数组用作查询的参数?
例如,
int x = 2,3,4,5
UPDATE 'table_name' set 'field' = data WHERE field_ID IN (x)
我问这个的原因是当我必须更新数据库中的数据时避免迭代 SQL 语句。 我还想过在 UPDATE 查询中使用 for each 语句,但我不知道如果更新 100 多条记录会减慢系统速度,是否会影响查询的性能。
我正在使用 VB.Net 顺便说一句。 我的数据库是 mysql Workbench。
【问题讨论】:
从数组字符串生成 (2, 3, 4, 5) UPDATE ... WHERE ID IN cond REPLACE string cond on string get from array 所以我需要先将我的整数数组转换为字符串,这就是你的意思吗? 是的。 Mysql不支持array-parameters和table-parameters。 @realnumber3012,使用纯 sql 可能会导致 sql 注入,所以我认为 Law 正在寻求一种适当的方法来解决 IN 语句的情况 @Rex 正确,先生。顺便说一句,2,3,4,5 只是一个示例,数组可以是任意大小,具体取决于选择的数量 【参考方案1】:如果您在变量(不是存储过程)中有查询并且没有大量 id,则可以构建自己的 IN。我还没有测试过这种方法的速度。
这段代码不会编译,只是给你一个想法。
query = "SELECT * FROM table WHERE col IN ("
For t = 0 TO x.Length-1
If t > 0 Then query &= ","
query &= "@var" & t
Next
query &= ")"
...
For t = 0 TO x.Length-1
cmd.Parameters.Add("@var" & t, SqlDbType.Int).Value = x(t)
Next
【讨论】:
【参考方案2】:我不熟悉 mySQL,但是在处理 MSSQL 时,我通常在 DB 中有一个拆分函数,以便我可以使用它在 VB 端将连接的整数值拆分为一个表,例如:
Dim myIds = 1, 2, 3, 4
Dim sql = <sql>
SELECT m.* FROM dbo.tblMyData m
INNER JOIN dbo.fncSplitIntegerValues(@Ids, ',') t ON t.id = m.Id
</sql>.Value
Using con As New SqlConnection("My connection string..."),
cmd As New SqlCommand(sql, con)
cmd.Parameters.Add("@Ids", SqlDbType.VarChar).Value =
myIds.Select(Function(m) m.ToString).Aggregate(Function(m, n) m & "," & n)
con.Open()
Dim rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection)
While rdr.Read()
Console.WriteLine(rdr.GetValue(0))
' do something else...
End While
End Using
dbo.fncSplitIntegerValues 是一个 db 函数,用于将连接的整数 varchar 拆分为具有给定分隔符的整数 Id。
重要的是不要使用普通的 sql,而是使用 sql 参数。
注意:以上样本未经测试...
【讨论】:
我的想法是将元素转换为字符串,以便将其传递给查询。感谢您的帮助。【参考方案3】:我已经得到了答案。我只需要将每个元素转换为字符串,然后将其与每个元素的“,”连接起来。所以我将传递的参数将是一个字符串。
回答: 诠释 x = 2,3,4,5 会变成 字符串 x = "2,3,4,5"
我的查询字符串将变为“UPDATE tablename SET field=value WHERE ID IN("&x&")”
感谢所有帮助过的人。
【讨论】:
以上是关于使用“IN”命令将数组作为要在 SQL 查询中使用的参数传递的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 SQL 的“IN”等字段上的数组过滤 django 查询集?
如何使用 SQL 的“IN”等字段上的数组过滤 django 查询集?