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

Posted

技术标签:

【中文标题】如何调节变量以使其获取 IN 子句中的所有值 [重复]【英文标题】:How to condition a variable so that it takes all values within IN clause [duplicate] 【发布时间】:2017-11-15 21:35:54 【问题描述】:

我很犹豫,也没有找到解决方案,所以我转向这里。 快速解释一下,假设我要过滤一个查询如下:

SELECT name FROM students WHERE courseCode IN (17, 18, 19);

在这里,我将获取参加课程 17 18 19的学生。

现在,您将如何获得注册这 3 门课程的学生?也就是在17 18 19?

当您知道“courseCode”值是什么时,可能会很简单,但是当您使用子查询获取这些值时,您会怎么做呢?

类似这样的:

SELECT name FROM students WHERE courseCode = 17 and courseCode = 18 and courseCode = 19;

当我知道值时(这是不正确的)

但是当我不知道它们是什么值时,我该怎么办?像这样:

SELECT name FROM students WHERE courseCode IN (SELECT courseCode FROM course WHERE ...);

希望你能解释清楚,谢谢你的帮助

【问题讨论】:

我相信你可以在这里使用ALL 条件。只需换掉 IN 并让它运行。 more info here 【参考方案1】:

这是一种可能的方法,使用 GROUP BY 折叠并获取不同课程代码的计数,并将其与文字进行比较:

 SELECT s.name
   FROM students s 
  WHERE s.courseCode IN (17,18,19)
  GROUP BY s.name
 HAVING COUNT(DISTINCT s.courseCode) = 3 

(17,18,19) 可以替换为子查询。但我倾向于使用内联视图和连接操作。

 SELECT s.name
   FROM students s
   JOIN ( SELECT 17 AS courseCode
           UNION ALL SELECT 18
           UNION ALL SELECT 19
        ) c
     ON c.courseCode = s.courseCode
  GROUP BY s.name
 HAVING COUNT(DISTINCT s.courseCode) = 3

内联视图c 的查询只需要返回具有适当数据类型的名为courseCode 的列的不同值...很多可能的查询都可以工作...

   JOIN ( SELECT foo AS courseCode 
            FROM bar 
           WHERE ... 
           GROUP BY foo
        ) c

这是一种方法的示例,还有其他方法......

【讨论】:

以上是关于如何调节变量以使其获取 IN 子句中的所有值 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

用逗号替换分号,并在存储过程中的字符串的两端添加引号,以使其在IN子句中可搜索

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

如果where子句在SQL中有重复的条件值,如何获取多行

匹配 IN 子句中的所有值

如何将 select 语句的 IN 子句中的参数作为具有多个值的参数传递?

如何拆分用户输入以使其占用数组中的两个索引位置? (Python)