在多列中使用IN

时间:2013-05-15 09:34:53

标签: sql sql-server c#-4.0 multiple-columns

只是一个简单的问题。我正在使用由用户手动输入的单个值,并执行与两列相比较的SQL查询,例如:

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)集进行比较?

如果没有,是否有其他(更有效的)方法在查询中给出一组值?

(我正在使用带有.NET 4.0 Client Profile的C#,使用Excel Interop访问该文件)

2 个答案:

答案 0 :(得分: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, ...)
)   

答案 1 :(得分: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;