带有AND逻辑的SQL IN子句

时间:2014-06-01 22:01:31

标签: sql sql-server

默认IN使用OR基本逻辑。有没有办法在范围内使用AND基础逻辑。

例如在下面的查询中

SELECT ItemId,CategoryID
FROM ItemCategories
WHERE CategoryID IN (4,5)

一个项目可以有多个类别。考虑将子集作为项目

|ItemID | CategoryID |
| 1     | 4          |
| 1     | 5          | 
| 2     | 4          |
| 2     | 6          |
| 3     | 4          |
| 3     | 5          | 

有没有办法排除item2?由于第2项有类别6.我想要的项目必须包含4和5。

使用IN子句在这里没有帮助。 4,5范围也是动态的。

2 个答案:

答案 0 :(得分:6)

除了使用IN ()仅限制行集外,您还需要验证每DISTINCT CategoryID ItemIDCOUNT()。要确保两个类别中都有商品,请验证其汇总IN ()是否为2(等于SELECT ItemID FROM ItemCategories WHERE CategoryID IN (4,5) GROUP BY ItemID -- When there are exactly 2 distinct categories -- you can be certain that they are the 2 requested in the -- IN () clause -- The value here must be equal to the number of items in the IN () HAVING COUNT(DISTINCT CategoryID) = 2 中的商品数量)。

IN ()

以下是演示:http://sqlfiddle.com/#!6/c9b6c/1

注意:这将提供与<{1}}子句的完全的集合,而不提供任何其他内容。如果您需要包含可能不在IN ()中的其他类别的内容,请在>=中将其更改为=而不是HAVING

HAVING COUNT(DISTINCT CategoryID) >= 2

答案 1 :(得分:1)

一种令人费解的方式是

select itemid
from (
  select itemid, count(distinct categoryid) c
  from ItemCategories
  where categoryid in (4,5)
  group by itemid) a
where a.c = 2

这是另一种令人费解的方式:

select itemid, group_concat(distinct categoryid) g
from ItemCategories 
group by itemid
having find_in_set(4,g) and find_in_set(5,g);

如果这是你所谈论的范围:

select itemid
from (
  select itemid, count(distinct categoryid) c
  from ItemCategories
  where categoryid between 4 and 9
  group by itemid) a
where a.c = 9-4+1;