我正在学习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;
数据库中有amount_paid和fine_amount以及court_fee的空值。我试图过滤那些不欠任何东西的罪犯 (fine_amount + court_fee) - amount_paid> 0
我一直在说错误
ORA-00920:无效的关系运算符
00920. 00000 - “无效的关系运营商”
*原因:
*行动:
行错误:43列:122
我根本无法让NVL在where子句中工作。我已经看到了使用NVL的where子句的例子,但是我看不出它们与我的查询有什么不同。
示例:
SELECT fname, lname, manager_emp_id
FROM employee
WHERE NVL(manager_emp_id, -999) != 7698;
答案 0 :(得分:1)
首先,我认为在创建数据库时应该避免使用NULL方法,因为所有空值占用了大量空间。在大多数情况下,在数据库中使用NULL是一个糟糕的实现。
NVL(amount_paid,null)表示如下: 如果amount_paid为'null',则将其设置为'null'。
我自己对数据库很新,但这可能是一个问题,请尝试设置NVL(amount_paid,0)。
否则NVL的使用是正确的。
答案 1 :(得分:1)
您使用–
代替-
。
等等,什么?
select dump('–') from dual;
Typ=96 Len=3: 239,191,189
select dump('-') from dual;
Typ=96 Len=1: 45