【问题标题】:SQL SELECT * FROM XXX WHERE columnName in ArraySQL SELECT * FROM XXX WHERE columnName in Array
【发布时间】:2010-12-09 09:03:32
【问题描述】:

我正在编写一些 SQL 代码。

我对语法很熟悉

SELECT * FROM myTable WHERE myColumn in ('1','2','3');

假设我正在编写一些 C# 代码,我想在其中使用 C# 数组,而我使用了 ('1','2','3')。我该怎么做?

【问题讨论】:

  • 您使用的是 LINQ to SQL 吗?如果没有,您使用什么进行数据访问?
  • myColumn 是字符串还是整数数据?如果是整数,你应该使用 tsql : myColumn in (1,2,3)

标签: c# sql arrays


【解决方案1】:

您可以动态构建 SQL 字符串。

如果你知道数组中的数据是好的(不是用户提供的),你可以直接做一个string.Join。

var sql = string.Format("SELECT * FROM myTable WHERE myColumn in ({0})", string.Join(", ", myArray));

如果你不知道它是净化过的数据,那么你应该使用带参数的命令。

var myArray = new string[] { "1", "2", "3" };
//var sql = string.Format("SELECT * FROM myTable WHERE myColumn in ({0})", string.Join(", ", myArray));

var cmd = new System.Data.SqlClient.SqlCommand();
var sql = new System.Text.StringBuilder();
sql.Append("SELECT * FROM myTable WHERE myColumn in (");
for (var i = 0; i < myArray.Length; i++)
{
    cmd.Parameters.Add("@" + i, myArray[i]);
    if (i > 0) sql.Append(", ");
    sql.Append("@" + i);
}
sql.Append(")");
cmd.CommandText = sql.ToString();

【讨论】:

【解决方案2】:

SQL 不支持通过 IN 子句将单个变量用于逗号分隔的值列表,这意味着您的 C# 代码必须将数组转换为该逗号分隔的列表。然后在执行查询之前将该列表连接到查询中。

否则,您需要考虑使用数据库的本机动态 SQL 语法 - 但这仍然意味着您必须将 C# 数组放入 SQL 中才能进行操作...

【讨论】:

    【解决方案3】:

    我会通过一个 for 循环并按照您想要的方式对其进行格式化。例如,假设您有一个数组:6,3,abc。使用 for 循环将其添加到一般字符串中,因此结果为: (6,3,abc);不难,然后将其插入到语句中。

    【讨论】:

      【解决方案4】:

      您只需执行string.Join 即可将数组创建为字符串,您可以将其作为参数传递给查询。

      例如:

      var values = new string[] { "1", "2", "3" };
      var parameterString = string.Join(",", values);
      
      var sql = "SELECT * FROM myTable WHERE myColumn in (@param)";
      
      var cmd = new SqlCommand(sql, connectionstring);
      cmd.Parameters.AddWithValue("@param", parameterString);
      var reader = cmd.ExecuteReader();
      

      【讨论】:

      • 是的,Donnie,您对主流的 sql 引擎是正确的 - 我习惯于通过 ODBC 连接查询 Infomix SE 数据库,接受这种语法。
      猜你喜欢
      • 1970-01-01
      • 2023-01-11
      • 2016-09-18
      • 1970-01-01
      • 1970-01-01
      • 2022-11-12
      • 1970-01-01
      • 2015-10-23
      • 2011-04-06
      相关资源
      最近更新 更多