在SQL Server中,是否可以在IN子句中包含2列?

时间:2013-03-19 14:52:09

标签: sql sql-server in-clause

我正在尝试使用IN子句,但过滤需要在由2列定义的一组项目上。这可能吗?可能还有其他方法可以做到这一点(例如表变量),但如果可能的话,我想将它作为IN子句来实现,因为在我的应用程序中动态创建会更优雅,更简单。

这个伪代码可能会让我更清楚我想要做的事情。

SELECT *
FROM Distributors
WHERE (City,State) IN (('Springfield','OH'), ('Springfield','MO'), ('Houston','TX'))

5 个答案:

答案 0 :(得分:5)

最简单的可能是生成伪表并对其执行连接。 VALUES(SQL Server 2008或更高版本):

SELECT d.*
FROM Distributors d
JOIN (VALUES ('Springfield','OH'), ('Springfield','MO'), ('Houston','TX'))
    as t(City,State)
ON d.City = t.City and d.State = t.State

UNION ALL

SELECT d.*
FROM Distributors d
JOIN (SELECT 'Springfield','OH' UNION ALL SELECT 'Springfield','MO' UNION ALL SELECT 'Houston','TX')
    as t(City,State)
ON d.City = t.City and d.State = t.State

我承认,我不再使用IN,但不同元素之间的分隔符都是相同的(在任何一种情况下),所以希望它仍然会出现:

  

在我的应用程序中动态创建更简单。

(另外,您的尝试不仅合理,而且实际上接近ANSI标准中的内容 - 在this connect issue投票时可能值得您投身)

答案 1 :(得分:3)

select * 
from distributors
where  ( city = 'Springfield' and State = 'OH') OR
       ( city = 'Springfield' and State = 'MO') OR
       ( city = 'Houston' and State = 'TX')

没那么复杂

答案 2 :(得分:2)

可以执行多个IN语句,这可以通过以下方式实现:

 SELECT *
 FROM Distributors
 WHERE CITY IN ('SPRINGFIELD', 'HOUSTON')
 AND STATE IN ('OH', 'MO', 'TX')

但是,您似乎希望使用OR

进行过滤
 SELECT *
 FROM Distributors
 WHERE (City = 'Houston' AND State = 'TX') OR
 (City = 'Springfield' AND State = 'OH') OR
 (City = 'Springfield' AND State = 'MO')

答案 3 :(得分:1)

这是一个答案,不是很好但是有效:

SELECT *
FROM Distributors d
  INNER JOIN (SELECT 
                'Springfield' AS city
                ,'OH' AS state
              UNION 
              SELECT
                'Springfield'
                ,'MO'
              UNION
              SELECT 
                'Houston'
                ,'TX') x
WHERE d.city = x.city
  AND d.state = x.State

答案 4 :(得分:0)

不支持此构造。但是你可以用与其他建议略有不同的方式来写这个:

SELECT <column list>
FROM dbo.Distributors
WHERE (City = 'Springfield' AND State IN ('OH', 'MO'))
   OR (City = 'Houston' AND State = 'TX');