SQL其中参数返回为数字而不是布尔值

时间:2015-04-23 08:01:01

标签: sql boolean arguments where

我是sql的新手,我遇到了错误 “WHERE的参数必须是类型boolean,而不是类型numeric”,来自以下代码

select subject_no, subject_name, class_size from Subject
where (select AVG(mark) from Grades where mark > 75)
group by subject_no
order by subject_no asc

为了帮助理解我正在尝试做的事情,列出平均分数小于75的主题

根据我的理解,虽然where参数将是布尔值,因为一个类的平均分数将高于或低于60,因此是假的,所以非常感谢帮助纠正我的理解。

3 个答案:

答案 0 :(得分:2)

<强>被修改!

使用相关子查询来查找avg(等级)&lt; 75.由于没有汇总功能,因此无需GROUP BY,而是使用DISTINCT来删除重复项:

select distinct subject_no, subject_name, class_size
from Subject s
where (select AVG(mark) from grades g
       where g.subject_no = s.subject_no) < 75
order by subject_no asc

注意,我假设subject_no表中也有Grades列。

答案 1 :(得分:1)

首先,如你所提到的,(select AVG(mark) from Grades where mark > 75)的返回值不是布尔值。它正好是AVG(标记)本身。所以你实际上可以这样写:

select 1+1 from dual and the return value is 2 or select 'hello world ' from dual 

并且返回值正是String hello world。

所以,如果你想要平均分数小于75的列表主题。下面的陈述应该更像是:

mark<(select AVG(mark) from Grades where mark > 75)

这将返回布尔值。 但是,你的陈述解释你的问题太难掌握了:P 我想程序员需要更多的时间来理解SQL,而不是 一开始太熟悉了。祝好运。如果你能更准确地解释你的问题......你正在寻找的答案要容易得多。

答案 2 :(得分:0)

您的查询中有更多错误 - 您必须将Grades表加入Subject Table,将条件移到select语句之外(并将>更改为<),最后删除{{ 1}}子句:

group by

您应该将select语句重写为此优化形式(此外,您还可以获得结果集中的平均标记):

select subject_no, subject_name, class_size from Subject
where (select AVG(mark) from Grades where Grades.subject_no = Subject.subject_no) < 75
order by subject_no asc