4

大家下午好,

我有一个关于 SQL 查询的问题。是否可以使用“IN”命令将数组用作查询的参数?

例如,

诠释 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。

4

3 回答 3

2

我已经得到了答案。我只需要将每个元素转换为字符串,然后将每个元素与“,”连接起来。所以我将传递的参数将是一个字符串。

答案:int x = {2,3,4,5} 将变为字符串 x = "2,3,4,5"

我的查询字符串将变为 "UPDATE tablename SET field=value WHERE ID IN("&x&")"

感谢所有帮助过的人。

于 2013-08-30T05:33:31.653 回答
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
于 2013-08-27T13:26:42.010 回答
0

我不熟悉 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 参数。

注:以上样品未经测试...

于 2013-08-27T07:59:19.367 回答