【问题标题】:Building SQL "where in" statement from list of strings in one line?从一行中的字符串列表构建SQL“where in”语句?
【发布时间】:2011-06-07 22:11:59
【问题描述】:

我有一个 List(Of String) 对应于我们数据库表上的“类型”。

我们正在使用 DB2 ADO.NET 提供程序,我的最终查询需要如下所示:

select * from table where type in (@type1, @type2, @type3, @type4)

过去,我使用 ForEach 循环构建了查询参数/主机变量的列表,但我真的很想找出一种方法来在一行中构建它们。当然,我可以加入所有字符串,但是添加“@”和递增数字让我很头疼。

有人对如何做到这一点有任何想法吗?

【问题讨论】:

  • 在 .net 4 中有 String.Concat 方法,但是在 iEnumerable 中获取项目的索引是一件痛苦的事情,而不是单行。 stackoverflow.com/questions/1290603/…我会对这个解决方案感兴趣。

标签: c# sql vb.net


【解决方案1】:

这样的东西不行吗?

var inList = "(" + string.Join(", ", typeList.Select(t => "@" + t)) + ")";

编辑

根据您的评论,这个怎么样?

var inList = "(" + 
    string.Join(", ", Enumerable.Range(1, argCount).Select(i +> "@type" + i)) +
    ")";

【讨论】:

  • 我过去也遇到过类似的问题,并且很痛苦地手动构建了这些问题。我真的很喜欢 linq 方法的优雅!
  • Good ol' LINQ-to-String 来救援。 :)
  • 嗯,我实际上需要参数是@type1、@type2 等。带有数字和所有内容。我只是想为每种类型创建一个参数,并在执行查询之前用类型的实际值填充每个参数。
【解决方案2】:
string dbCommand = 
    string.Format("select * from table where type in ({0})", string.Join(",", typeList.Select(p => "@" + p));

【讨论】:

    【解决方案3】:

    这就是我通常的做法

    string.Join(",", items.Select(i => $"'{i}'");
    

    【讨论】:

      【解决方案4】:

      使用string.Join(",", listType.ToArray())拆分列表

          string types = string.Join(",", listType.ToArray());
      
          Select * from table where type in (types)
      

      【讨论】:

        【解决方案5】:

        一个简单的方法是使用:

        "'" + string.Join("','", myListOfNames) + "'")
        

        【讨论】:

          【解决方案6】:

          SQL/ADO.NET 不支持数组。所以你真的必须手动构建 SQL。

          SQL 2008 确实支持 Table 参数,但似乎开销很大。详情请见http://www.sommarskog.se/arrays-in-sql-2008.html

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2021-03-11
            • 2017-04-24
            • 2021-12-23
            • 1970-01-01
            • 2012-10-24
            • 2014-09-26
            • 2013-10-29
            相关资源
            最近更新 更多