2013-05-15 26 views
2

只是一個簡單的問題。我使用的是由用戶手動inputed單一的價值觀和做一個SQL查詢與兩列,如:使用IN與多列

SELECT col3,col1,col4 FROM table WHERE 
col1='SomeReallyLongText' OR col2='SomeReallyLongText' 

SomeReallyLongText的重複是可以容忍的,但我的方案還支持通過Excel文件有幾百個循環行 - 這意味着我會做:

SELECT col3,col1,col4 FROM table WHERE 
col1 IN('item1','item2',...'itemN') OR col2 IN('item1','item2',...'itemN') 

和查詢將詳盡長,我不能想象是有效的。 有沒有辦法縮短這個所以兩列可以比較相同的IN(xxx)集?

如果沒有,是否有其他(更有效率)的方式來給查詢中的一組值?

(我使用C#和.NET 4.0客戶端配置文件,使用Excel互操作訪問文件)

+0

您可以使用表值參數傳遞的東西陣列,而不是隻用'DataTable's和存儲過程的http:/ /www.mssqltips.com/sqlservertip/2112/table-value-parameters-in-sql-server-2008-and-net-c/ –

回答

3

我不是太肯定的表現你會與此獲得:

SELECT col3,col1,col4 FROM table 
WHERE EXISTS (
    SELECT 1 
    FROM (VALUES 
     ('item1') 
     , ('item2') 
     , ... 
     , ('itemN') 
    ) AS It(m) 
    WHERE It.m IN (col1, col2, ...) 
) 
+0

可以縮短'VALUES(('a'),('b'),('c')...('n'))',可能是'VALUES('a','b 」, 'C' ... 'N')'? – Whoop5

+0

這些不一樣,所以不採用這種方法。 – Serge

+0

選擇您的答案,因爲它不涉及在服務器上創建新表。 – Whoop5

1

您可以創建一個臨時表來存儲IN子句中使用的所有值

IF OBJECT_ID('tempdb..#Sample') IS NOT NULL DROP TABLE #Sample 

Create table #Sample 
(name varchar(20)) 

Insert into #Sample 
values 
('item1'),('Item2'),.... 

SELECT col3,col1,col4 FROM table WHERE 
col1 IN (Select name from #Sample) OR col2 IN(Select name from #Sample) 

,或者如果您使用的是Linq to SQL,那麼你可以存儲收集的Excel數據,並使用Contains方法來查詢數據庫

var excelVal = new string[] { 'item1','item2'... }; 
var result = from x in Table 
      where excelVal .Contains(x.Col1) || excelVal.Contains(x.Col2) 
      select x; 
+0

嘗試在同一會話中執行兩次前三行。你會得到「數據庫中已經有一個名爲'#Sample'的對象。」錯誤 – Raj