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

在SQL Server中,是否可以在In子句中包含2列?,sql,sql-server,in-clause,Sql,Sql Server,In Clause,我试图使用IN子句,但是筛选需要在由两列定义的一组项上进行。这可能吗?可能还有其他方法可以做到这一点(例如,table变量),但如果可能的话,我希望将其作为IN子句来实现,因为在我的应用程序中动态创建会更加优雅和简单 这个psuedo代码可能会让我更清楚地知道我在做什么 SELECT * FROM Distributors WHERE (City,State) IN (('Springfield','OH'), ('Springfield','MO'), ('Houston','TX')) 可

我试图使用IN子句,但是筛选需要在由两列定义的一组项上进行。这可能吗?可能还有其他方法可以做到这一点(例如,table变量),但如果可能的话,我希望将其作为IN子句来实现,因为在我的应用程序中动态创建会更加优雅和简单

这个psuedo代码可能会让我更清楚地知道我在做什么

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

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

 SELECT *
 FROM Distributors
 WHERE CITY IN ('SPRINGFIELD', 'HOUSTON')
 AND STATE IN ('OH', 'MO', 'TX')
但是,您似乎希望使用

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

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

 SELECT *
 FROM Distributors
 WHERE CITY IN ('SPRINGFIELD', 'HOUSTON')
 AND STATE IN ('OH', 'MO', 'TX')
但是,您似乎希望使用

 SELECT *
 FROM Distributors
 WHERE (City = 'Houston' AND State = 'TX') OR
 (City = 'Springfield' AND State = 'OH') OR
 (City = 'Springfield' AND State = 'MO')
没那么复杂


没有那么复杂的

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

联合所有

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
我承认,我不再在
中使用
,但不同元素之间的分隔符都是相同的(在任何一种情况下),因此希望它仍然能够命中:

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


(而且,您的尝试不仅合理,实际上与ANSI标准中的内容非常接近-可能值得您投票)

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

联合所有

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
我承认,我不再在
中使用
,但不同元素之间的分隔符都是相同的(在任何一种情况下),因此希望它仍然能够命中:

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


(此外,您的尝试不仅合理,实际上接近ANSI标准中的标准-可能值得您投票)

这里有一个答案,不漂亮,但它有效:

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

下面是一个答案,虽然不漂亮,但很有效:

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

不支持此构造。但是,您可以用与其他建议稍有不同的方式编写此建议:

SELECT <column list>
FROM dbo.Distributors
WHERE (City = 'Springfield' AND State IN ('OH', 'MO'))
   OR (City = 'Houston' AND State = 'TX');
选择
来自dbo.分销商
其中(城市='Springfield'和州('OH','MO'))
或者(城市为“休斯顿”,州为“德克萨斯州”);

不支持此构造。但是,您可以用与其他建议稍有不同的方式编写此建议:

SELECT <column list>
FROM dbo.Distributors
WHERE (City = 'Springfield' AND State IN ('OH', 'MO'))
   OR (City = 'Houston' AND State = 'TX');
选择
来自dbo.分销商
其中(城市='Springfield'和州('OH','MO'))
或者(城市为“休斯顿”,州为“德克萨斯州”);


@John-我一开始是这样做的,但在你发表评论之前更正了它。但这也会错误地匹配他可能不想要的('Springfield','TX')。是的,但你的查询也会让休斯顿回来,哦,这是我不想要的。@Minky我相信OP想要一种不同类型的查询,这种查询在本例中不使用。@John-检查我的更新。我已经包括了你如何做到这一点。@John-我最初是这样做的,但在你发表评论之前更正了它。但这也会错误地匹配他可能不想要的('Springfield','TX')。是的,但你的查询也会让休斯顿回来,哦,这是我不想要的。@Minky我相信OP想要一种不同类型的查询,这种查询在本例中不使用。@John-检查我的更新。我已经包括了如何实现这一点。什么版本的SQL Server?我在过去通过concatating做过这件事;但我不确定这是不是一个好方法:我会做一些事情,比如城市+'@'+州在哪里Springfield@OH', 'Springfield@MO', 'Houston@TX’)什么版本的SQL Server?我以前做过这件事,通过;但我不确定这是不是一个好方法:我会做一些事情,比如城市+'@'+州在哪里Springfield@OH', 'Springfield@MO', 'Houston@TX事实上,我想这正是我想要的。我想我需要and IN子句,但是OR条件做完全相同的工作。使用OR子句而不是IN将导致更好的性能。实际上,我想这可能正是我想要的。我想我需要和IN子句,但或条件做的工作完全相同。使用或子句而不是IN将导致更好的性能我同意。实际上,生产代码中禁止使用“In”条款。如果存在或上述技巧之一,则首选。投票支持替代语法。哇,这个问题从2007年就开始了。然而,我得到了一个“不再对这个项目启用投票”。@John-这很奇怪。我确信会有一个连接的问题,但我以前没有亲眼看到过-所以我只是投了我的一票,它被接受了,没有任何错误,我的错。投票不再被允许,因为我刚刚点击了它却没有意识到。哦,我同意。实际上,生产代码中禁止使用“In”条款。如果存在或上述技巧之一,则首选。投票支持替代语法。哇,这个问题从2007年就开始了。然而,我得到了一个“不再对这个项目启用投票”。@John-这很奇怪。我确信会有一个连接的问题,但我以前没有亲眼看到过-所以我只是投了我的一票,它被接受了,没有任何错误,我的错。投票不再被允许,因为我刚刚点击了它却没有意识到。哦。