Sql db查询where子句中的NVL和关系运算符

Sql db查询where子句中的NVL和关系运算符,sql,oracle,Sql,Oracle,我正在学习SQL和使用Oracle 11。我正在与一个犯罪数据库合作,试图找到那些未付费用的罪犯。我的问题如下 select first, last, charge_id, (fine_amount + court_fee) as "Total Amount Owed", NVL(amount_paid, null), (fine_amount + court_fee - amount_paid) as "Amount Owed", pay_due_date from crime_charge

我正在学习SQL和使用Oracle 11。我正在与一个犯罪数据库合作,试图找到那些未付费用的罪犯。我的问题如下

select first, last, charge_id, (fine_amount + court_fee) as "Total Amount Owed", NVL(amount_paid, null), (fine_amount + court_fee - amount_paid) as "Amount Owed", pay_due_date 
from crime_charges cc, criminals c, crimes
where crimes.crime_id = cc.crime_id and c.criminal_id = crimes.criminal_id and (NVL(fine_amount, 0) + NVL(court_fee, 0)) – NVL(amount_paid, 0 ) > 0;
数据库中支付的金额、罚款金额和法庭费用的值为空。我试图过滤掉那些不欠任何钱的罪犯 (罚款金额+法庭费)–支付金额>0

我一直在说一个错误 ORA-00920:无效的关系运算符 92000000-“无效的关系运算符” *原因:
*行动: 第43行第122列出错

我根本无法让NVL在where子句中工作。我见过使用NVL的where子句的例子,但我看不出它们与我的查询有什么不同

例如:

SELECT fname, lname, manager_emp_id

FROM employee

WHERE NVL(manager_emp_id, -999) != 7698;

首先,我认为在创建数据库时应该避免使用NULL方法,因为所有NULL都会占用大量空间。在大多数情况下,在数据库中使用空值是一个糟糕的实现

NVL(已付金额,空)说明如下: 如果支付的金额为“空”,则将其设置为“空”

我自己对数据库很陌生,但这可能是一个问题,请尝试设置NVL(amount_paid,0)


否则NVL的用法是正确的。

您使用的是
-
而不是
-

等等,什么

select dump('–') from dual;
Typ=96 Len=3: 239,191,189

select dump('-') from dual;
Typ=96 Len=1: 45

如果罪犯没有支付任何费用,教师实际上希望null出现。但是你有一个很好的观点,那就是我可能不需要select语句中的NVL(amount\u paid,null),因为amount\u paid已经为null,它基本上不应该做任何事情。但是我正在使用我们学校课本上的一个数据库,它使用空值让我们学习如何使用NVL。其思想是,不能将空值添加到某个数字,并将其等同于另一个数字。示例罚款金额=1000法庭费=25已付金额=零。数据库将添加1000+25-null>0。我认为您需要在计算周围添加一个括号,如:((NVL(罚款金额,0)+NVL(法庭费用,0))–NVL(支付金额,0))>0;如果您的老师希望在没有付款时使用
NULL
,请使用
NULL(已付款金额,0)
。如果
amount\u paid
为零,函数将返回
NULL
。对于任何其他值,它将返回
已支付金额
。也要注意另一个答案关于长距离短跑的建议。例如,如果粘贴Word文档中的查询,可能会出现这种情况。使用null的替代方法可能需要更多的空间。Oracle中的NULL需要1个字节。超级关系设计(或其他任何名称)需要额外的表和行。即使这些表非常稀疏,也不会有多大帮助。我非常不同意数据库中的NULL是一个糟糕的实现。非常感谢,问题实际上是“-”vs“-”。我从老师给我们的pdf中复制粘贴了它,从来没有想过这个角色是什么。