2010-07-08 25 views
1

我的程序在運行時產生一個列表值。我需要發送一個sql查詢,該查詢在表中查找具有包含列表中某個值的列的條目。我不能使用通常的OR鏈,因爲我不知道列表會有多大。有沒有一種很好的方式來使用數組或一些IEnumerable來構建一條SQL語句,爲我創建一個大型的OR鏈?使用C#BTW如何以一種很好的方式以編程方式發送SQL Server select語句中的值列表?

我正在使用SQL Server,但我更喜歡一些適用於所有數據庫的東西,如果存在這樣的事情。

謝謝!

回答

2

試試這個:

SELECT * FROM table WHERE column IN (@param) 

並確保你把@param到表單 「 '@ P1,P2 @,@ P3'」 用你選擇的語言的破滅功能。

查詢應該是我知道的所有SQL的標準。

或者,如果你想要做LIKE比較:

SELECT * FROM table WHERE @param LIKE '%' (COALLESCE) column (COALLESCE) '%' 

@參數仍然是一個引用的字符串,但你需要使用不同的COALLESCE運營商根據您的數據庫(SQL服務器:「+」, MySQL:'。',Oracle:'|')。

示例PHP破滅代碼:

$ps = array('1', 'test', '323'); 
$param = implode(',', $ps); 

實例C# 「內爆」 代碼:

string[] ps = new string[] { "test", "blah", "boo" }; 
string param = string.Join(",", ps)); 
+0

謝謝,這很快捷! 看起來像「IN」也是在SQL標準,這是很好的。 – 2010-07-08 05:43:17

3

閱讀了厄蘭Sommarskog的優秀Arrays and Lists in SQL Server文章 - 他非常詳細,並與偉大的見解什麼可以解釋在哪個版本的SQL Server中完成。我也認爲這將是特定於數據庫的,我沒有看到任何方法可以兼容ANSI SQL或在其他數據庫上工作 - 對於每個數據庫,字符串和XML處理過於具體,我猜測。

2

有一兩件事你可以嘗試在存儲過程表值參數在MS-SQL:

http://www.sqlteam.com/article/sql-server-2008-table-valued-parameters

不僅是unmessy因爲所有你要做的就是添加行到您的表對於列表中的每個值而言,它們都是值參數,但與備選方案相比,它也可以快速執行,因爲SQL DBMS可以在每次運行查詢時重複執行計劃,因爲參數數量永遠不會發生變化。

相關問題