2

只是一个快速的问题。我正在使用用户手动输入的单个值并执行 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) 集进行比较?

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

(我使用 C# 和 .NET 4.0 客户端配置文件,使用 Excel 互操作访问文件)

4

2 回答 2

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, ...)
)   
于 2013-05-15T09:46:40.303 回答
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;
于 2013-05-15T09:43:15.110 回答