在 as 语句中 IS NOT NULL

Posted

技术标签:

【中文标题】在 as 语句中 IS NOT NULL【英文标题】:IS NOT NULL on as statement 【发布时间】:2014-05-29 12:21:07 【问题描述】:

我有两个表,分别称为“教师”和“课程”。表'teachers'有四列,即teacher_id、teacher_name、teacher_work_hours和course_id。表“课程”有两列,即 course_id 和 course_name。我想从表'teacher'中选择两列,并计算表'courses'中teacher.course_id = course.course_id的实例数。查询应丢弃表 course 的 count() 为零的行,即 count() 为零的行不应显示在结果集中。我怎么做? 我有这个问题。

select t.teacher_name, t.teacher_work_hours, (select count(*) 
                     from course where course_id = t.course_id
                     having count(*) > 0) as COURSES 
from teacher t 
where teacher_work_hours > 5 
  AND COURSES IS NOT NULL

查询不正确,因为它不允许我将 IS NOT NULL 运算符放在 COURSES 上。

【问题讨论】:

ROLES IS NOT NULL 在这里有什么意义? xyz 表中可用的字段有哪些?没有条件......它总是有相同的计数...... 最好给出示例数据和期望的结果,而不是显示您损坏的查询和糟糕的解释。不太清楚你想用这种方法做什么。 除了显示您损坏的查询* 您不能在WHERE 子句中使用列别名。唯一允许使用列别名的子句是ORDER BY 【参考方案1】:

ROLES 是一个表而不是一个列,无论如何它只出现在子查询中。这不是更有意义吗? (这仍然行不通,因为您不能在 WHERE 子句中使用别名,但它更接近于有意义。)

SELECT name, class, (SELECT COUNT(*)
                     FROM xyz
                     -- HAVING COUNT(*) > 0
                         -- Doesn't make sense without a GROUP BY
                     ) AS ROLES
FROM abc
WHERE class > 5
  AND ROLES IS NOT NULL

不过,我认为这不是您真正想要做的,因为子查询不依赖于abc 的当前行。您可能需要更改查询以使用联接和 GROUP BY 而不是子查询。

【讨论】:

首先,不能在 WHERE 子句中使用列别名。第二次使用没有 group by 并检查 ROLES IS NOT NULL 没有意义 虽然仅供参考,但我没有投反对票,但ROLES 将返回计数(没有任何分组的总计数)。我不明白,在这里检查roles is not null 会有什么好处。 不能在Where子句中使用列别名,所有查询都是废话,因为count和主表abc没有关联... @MS:这不是一个“答案”,因为它不是一个有效的解决方案。答案不包含有效的解决方案;答案通常不需要这样做。提供的 SQL 代码旨在建议一种方法,尽管它有缺陷,但更接近于正确的路线。真正的解决方案是遵循建议并重构查询以使用联接和分组依据。 @Justin,我不确定您的评论应该添加什么,因为这些都是在答案本身中评论的内容。【参考方案2】:

查询不清楚。但我只是想分享以下查询供您参考。请检查查询是否有用...

SELECT class, ROLES.Total
FROM   abc 
CROSS APPLY
(SELECT COUNT(*) AS Total FROM xyz WHERE abc.class = xyz.class) ROLES
WHERE  class > 5 

【讨论】:

以上是关于在 as 语句中 IS NOT NULL的主要内容,如果未能解决你的问题,请参考以下文章

Swift Any、Type、is、as

面向对象 is和as运算符,类库,委托

oracle存储过程中is和as的区别

c# -- is和as运算符

as expected 和 as is expected 一样吗?

IS 和AS