匹配 IN 子句中的所有值

Posted

技术标签:

【中文标题】匹配 IN 子句中的所有值【英文标题】:Matching all values in IN clause 【发布时间】:2012-07-23 01:51:59 【问题描述】:

有没有办法确保IN 子句中的所有值都匹配?

例子:

我可以将 IN 用作:IN (5,6,7,8)

我需要它像 AND 一样跨多行工作。

更新: 我需要这个来列出符合指定参数的 db 公司。公司和分类是多对多的关系。我正在使用 Yii 框架。这是我的控制器的代码:

public function actionFilters($list)

    $companies = new CActiveDataProvider('Company', array(
        'criteria' => array(
            'condition'=> 'type=0',
            'together' => true,
            'order'=> 'rating DESC',
            'with'=>array(
            'taxonomy'=>array(
                'condition'=>'term_id IN ('.$list.')',
                )
            ),
        ),
    ));
    $this->render('index', array(
        'companies'=>$companies,
    ));

【问题讨论】:

你想要什么结果? AND 是一个布尔运算符;您希望它对数字列表做什么? 不确定您在这里要求什么。在 WHERE 子句中使用 IN 时,将为您提供字段值与这些值之一匹配的所有行。一个文件不可能有所有这些值,所以我不知道你在从这个理论上的 AND() 函数中寻找什么。 我正在使用它根据标准列出来自 db 的行。此条件是分类 ID 列表。 有什么替代方案? @RPM 引用需要。我认为您可能对在子查询中使用 IN 感到困惑,这很慢,因为子查询将针对每条记录运行。在常量列表上使用 IN 从来没有任何问题。如果有什么我期望它会更快。 【参考方案1】:

你可以这样做:

select ItemID
from ItemCategory
where CategoryID in (5,6,7,8) <-- de-dupe these before building IN clause
group by ItemID
having count(distinct CategoryID) = 4 <--this is the count of unique items in IN clause above

如果您提供您的架构和一些示例数据,我可以提供更相关的答案。

SQL Fiddle Example

【讨论】:

如果我不知道这个号码怎么办? @DimaKnivets 什么情况下你会不知道?这些类型的查询需要动态创建。 @DimaKnivets 您解析查询字符串参数并拆分出 unqiue 条目,然后使用这些条目创建参数化的 IN 子句,并使用项目计数来创建 HAVING 子句。 警告:如果有一个项目包含在类别[5,6,7,8] 以及任何其他类别中,这实际上不起作用。 @stackFan 不,4 是您的 WHERE 子句中的唯一项目数,而不是表本身。【参考方案2】:
 SELECT ItemID
     FROM ItemCategory
        WHERE (
               (CategoryID = 5) OR 
               (CategoryID = 6) OR 
               (CategoryID = 7) OR 
               (CategoryID = 8)
              )
     GROUP BY ItemID
 HAVING COUNT(DISTINCT CategoryID) = 4

【讨论】:

HAVING COUNT (CategoryID) 更改为 HAVING COUNT (DISTINCT CategoryID) 将有助于防止如果其中一个值出现两次(如上面 RedFilter 的答案)出现误报。

以上是关于匹配 IN 子句中的所有值的主要内容,如果未能解决你的问题,请参考以下文章

Oracle In(匹配)子句

Oracle In(匹配)子句

where子句中的多个字符匹配

如何调节变量以使其获取 IN 子句中的所有值 [重复]

按 SQL IN() 子句中的值顺序排序

我们应该在检索数据时避免 DB2 SQL 中的 IN 子句吗?