我正在尝试使用IN子句,但过滤需要在由2列定义的一组项目上。这可能吗?可能还有其他方法可以做到这一点(例如表变量),但如果可能的话,我想将它作为IN子句来实现,因为在我的应用程序中动态创建会更优雅,更简单。
这个伪代码可能会让我更清楚我想要做的事情。
SELECT *
FROM Distributors
WHERE (City,State) IN (('Springfield','OH'), ('Springfield','MO'), ('Houston','TX'))
答案 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');