2014-01-11 172 views
3

我有一个+ 250K行的表。如何根据值列表选择行

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

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

但有时这种失败,因为我的查询获取太长。

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

但是这种感觉不正确...

有什么建议吗?

+0

匹配所有字符串或它们中的任何一个? –

+0

@ GabyakaG.Petrioli其中任何一个,都会相应更新问题... – msp1982dk

回答

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个左右项目的查询应该低于此限制。

+0

没错,我试过了字符串连接解决方​​案。我会尽力解决您的问题,谢谢! – msp1982dk

1

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

+0

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