Plsql Oracle PL/SQL,其中条件:不等于0或null

Plsql Oracle PL/SQL,其中条件:不等于0或null,plsql,oracle-sqldeveloper,Plsql,Oracle Sqldeveloper,我选择的id不能等于0,也不能是(null)。我写道: WHERE id IS NOT NULL (+) and id not in ('0') 我犯了两个错误 错误(9,5):PL/SQL:SQL语句被忽略 错误(38119):PL/SQL:ORA-00933:SQL命令未正确结束 我把它改为: 同样的错误也发生了。我应该写什么作为WHERE子句?应该是吗 WHERE id IS NOT NULL AND id != 0 (+)用于外部联接。你应该写: Where nvl(Id,0)<

我选择的
id
不能等于0,也不能是
(null)
。我写道:

WHERE id IS NOT NULL (+) and id not in ('0')
我犯了两个错误

错误(9,5):PL/SQL:SQL语句被忽略

错误(38119):PL/SQL:ORA-00933:SQL命令未正确结束 我把它改为:

同样的错误也发生了。我应该写什么作为
WHERE
子句?

应该是吗

WHERE id IS NOT NULL
AND id != 0
(+)用于外部联接。你应该写:

Where nvl(Id,0)<>0
其中nvl(Id,0)0

您可以将条件简化为:

WHERE id != 0
因为与NULL的比较(同时使用=或!=运算符)的计算结果总是为NULL(在SQL中,在条件中被视为“false”),
因此无效!=0的计算结果始终为FALSE,在此情况下,您可以跳过此部分

WHRE id != 0 AND id IS NOT NULL


Braiam的答案
Where nvl(Id,0)0
,虽然正确,但会阻止数据库在
Id
列上使用索引,这可能会对性能产生不良影响。

如果我有另一个条件,我是否应该将
Where[condition]和nvl(Id,0)0
?不要使用[]将谓词括在它不会编译的PLSQL中。如果需要,请使用普通括号。您可以拥有所需的任意多个逻辑表达式。
WHRE id != 0 AND id IS NOT NULL