基于值列表如何选择行

3
我有一个包含250K行的表格。
我需要获取与字符串值列表中任何字符串匹配的行(这个列表中的字符串数量可以从几个到100个不等)。
我尝试了以下方法:SQL Select where values in List<string>,但有时候查询语句过长会导致失败。
目前,我正在获取整个表格,然后在LINQ中处理它。但这样做感觉不太对...
有什么建议吗?

匹配所有字符串还是其中任意一个? - Gabriele Petrioli
@GabyakaG.Petrioli 任何一个都可以,我会相应地更新问题... - msp1982dk
2个回答

2
有时候,我的查询语句太长,导致查询失败。
您似乎选择了您所链接的问题的被接受答案,即这个:这个
String query = "select * from table where RecordId in ({0});";
String formatted = String.Format(query, String.Join(",", list.ToArray()));

这种方法的一个缺点是查询会与列表中所有字符串的总长度成比例增长,因此如果您的列表有许多非常长的字符串,则有可能超过允许的查询长度。幸运的是,还有另一个解决方案可以避免这个问题 - 也就是这个
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个项目左右的查询应该远远低于此限制。

没错,我已经尝试过字符串拼接的解决方案了。我会试试您的解决方案,谢谢! - msp1982dk

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

很好的建议,但不幸的是我无法在数据库中添加/编辑表格。 - msp1982dk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接