【问题标题】:In SQL Server, is it possible to include 2 columns in an IN clause?在 SQL Server 中,是否可以在 IN 子句中包含 2 列?
【发布时间】:2013-03-19 14:52:09
【问题描述】:

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

这个伪代码可能会让我更清楚我想要做什么。

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

【问题讨论】:

  • 什么版本的 SQL Server?
  • 我过去通过 concatinating 做过这件事;但我不确定这是一个好方法:我会做类似 WHERE City + '@' + State IN ('Springfield@OH', 'Springfield@MO', 'Houston@TX') 之类的事情

标签: sql sql-server in-clause


【解决方案1】:

最简单的可能是生成一个伪表并对其执行连接。 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 上投票)

【讨论】:

  • 我同意。表面上,“IN”子句在生产代码中是被禁止的。 WHERE EXISTS 或上述技巧之一是首选。支持替代语法。
  • 哇,这个问题自 2007 年以来就已开放。但是,我得到了“不再对此项目启用投票”。
  • @John - 这很奇怪。我确信 是一个连接问题,但我之前没有亲眼见过 - 所以我只是投了票,它被接受了错误
  • 达米安,我的错。不再允许投票,因为我只是在没有意识到的情况下点击了它。哦。
【解决方案2】:
select * 
from distributors
where  ( city = 'Springfield' and State = 'OH') OR
       ( city = 'Springfield' and State = 'MO') OR
       ( city = 'Houston' and State = 'TX')

没那么复杂

【讨论】:

  • 实际上,我认为这可能正是我正在寻找的。我在想我需要和 IN 子句,但 OR 条件做的工作完全相同。
  • 并且使用 OR 子句而不是 IN 会带来更好的性能
【解决方案3】:

可以执行多个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')

【讨论】:

  • @John - 我最初是这样做的,但在您发表评论之前更正了它。
  • 但这也会错误地匹配他可能不想要的 ('Springfield', 'TX')..
  • 是的,但是您的查询也带回了我不想要的俄亥俄州休斯顿。
  • @Minky 我相信 OP 想要一种不同类型的查询,在这种情况下不使用 IN。
  • @John - 检查我的更新。我已经介绍了如何实现这一目标。
【解决方案4】:

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

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

【讨论】:

    【解决方案5】:

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

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

    【讨论】:

      猜你喜欢
      • 2013-06-28
      • 1970-01-01
      • 2019-03-03
      • 2019-11-21
      • 2011-01-05
      • 1970-01-01
      • 1970-01-01
      • 2016-05-13
      • 1970-01-01
      相关资源
      最近更新 更多