2014-01-11 173 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