【问题标题】:Using IN with multiple columns对多列使用 IN
【发布时间】:2013-05-15 09:34:52
【问题描述】:

只是一个简单的问题。我正在使用用户手动输入的单个值并执行 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 互操作访问文件)

【问题讨论】:

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


【解决方案1】:

我不太确定你会得到什么性能:

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

【讨论】:

  • 可以将VALUES(('a'),('b'),('c')...('n')) 缩短为VALUES('a','b','c'...'n') 之类的吗?
  • 这些不一样,所以不用这种方法。
  • 选择了您的答案,因为它不涉及在服务器上创建新表。
【解决方案2】:

您可以创建一个临时表来存储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;

【讨论】:

  • 尝试在同一会话中执行前 3 行两次。您将得到“数据库中已经有一个名为 '#Sample' 的对象。”错误
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-16
  • 1970-01-01
  • 2018-10-04
  • 2013-04-06
  • 2013-09-11
相关资源
最近更新 更多