Utiliser IN avec plusieurs colonnes

Juste une question rapide. J'utilise des valeurs individuelles saisies manuellement par l'user et en faisant une requête SQL comparant à deux colonnes, comme:

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

La répétition de SomeReallyLongText est tolérable, mais mon programme supporte aussi la lecture en boucle d'un document Excel avec plusieurs centaines de lignes – ce que je vais faire:

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

Et la requête serait exhaustive, ce que je ne peux imaginer est efficace. Y a-t-il un moyen de raccourcir cela afin que deux colonnes puissent être comparées au même set IN (xxx)?

Sinon, existe-t-il d'autres moyens (plus efficaces) de donner l'set des valeurs dans la requête?

(J'utilise C # avec .NET 4.0 Client Profile, en utilisant Excel Interop pour accéder au file)

Je ne suis pas sûr de la performance que vous obtiendriez avec ceci:

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

Vous pouvez créer une table temporaire pour stocker toutes les valeurs utilisées dans la clause 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) 

ou si vous utilisez Linq to SQL vous pouvez stocker datatables Excel dans collection et utiliser la méthode Contains pour interroger la database

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