如何根据值列表选择行

时间:2014-01-11 10:54:31

标签: c# sql

我有一个+ 250K行的表。

我只需要获取与字符串值列表中的任何字符串匹配的行(这可以是从几个到+100值的任何位置)。

我尝试过这种方法: SQL Select where values in List<string>

但有时这会失败,因为我的查询太长了。

目前我正在获取整个表,然后在LINQ中处理它。

但这感觉不对......

有什么建议吗?

2 个答案:

答案 0 :(得分:2)

  

但有时这会失败,因为我的查询太长了。

您似乎已选择已关联的问题的已接受答案,即this one

String query = "select * from table where RecordId in ({0});";
String formatted = String.Format(query, String.Join(",", list.ToArray()));

这种方法的一个缺点是查询会与列表中所有字符串的总长度成比例增长,因此如果列表中有很多字符串很长,那么您运行的可能性超过了查询的允许长度

幸运的是,这个问题的另一个答案是没有问题的 - 即this one

IEnumerable<TableRow> query =
  from t in db.Table
  where RecordList.Any(r => t.RecordId == r)
  select t;

它不是直接将字符串值插入查询字符串,而是使用一种方法来生成参数化查询。现在长度仅取决于列表中的项目数,而不取决于它们的长度。因此,如果此查询适用于最大长度为100个项目的列表,则无论列表中的总字符串长度如何,它都将继续工作。

这种方法确实有一个限制 - 取决于RDBMS,IN列表中的项目总数可能会受到限制。但是,默认上限非常高 - 对于Oracle约为1000,对于MS SQL Server约为2000,因此您对100项左右的查询应该远低于此限制。

答案 1 :(得分:1)

您可以将100多个值添加到临时表中,然后查询SELECT * FROM YourTable WHERE YourValue IN (SELECT YourValue FROM #TempValues)