使用“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的查询条件?

如何使用 SQL 的“IN”等字段上的数组过滤 django 查询集?

如何使用 SQL 的“IN”等字段上的数组过滤 django 查询集?

在自定义函数中使用 SQL 查询作为数组参数(输入)

EXCEL中SQL Server Where 使用某一列的数据作为 查询条件的命令?

将附加条件附加到查询