只有当两者都不为空并且不匹配时,才将两个值的Eval比较为FALSE

时间:2009-11-26 20:07:30

标签: sql oracle

Where子句: 我应该在Proc中测试列的值,但是如果它们中至少有一个为null,那么它应该为TRUE。只有当BOTH NOT NULL(它是表中ID列的整数值)时,比较结果才应为FALSE。

现在我有了这个: ...

and nvl(nvl(b.account_id, account_id_), 0) = nvl(nvl(account_id_, b.account_id), 0)

b.account__id - 表中的列(整数),account_id_ - Proc中的Param属于同一类型。

它有效,但恕我直言看起来很奇怪了解评估的目的是什么。 所以我试着让它更易于阅读,但没有真正好的结果。

我尝试过COALESCE - 但如果两者都为空,则需要检查null。 LNNVL是一个很好的,但是如果它们两个相等则它会给出FALSE,但在这种情况下我需要True。

有什么好主意吗?

2 个答案:

答案 0 :(得分:2)

如果我理解正确的话,应该这样做:
(b.account_id IS NULL OR account_id_ IS NULL OR b.account_id = account_id_)

答案 1 :(得分:0)

此:

and nvl(nvl(b.account_id, account_id_), 0) = nvl(nvl(account_id_, b.account_id), 0)

...与:

相同
AND COALESCE(b.account_id, account_id_, 0) = COALESCE(account_id_, b.account_id, 0)

两者都过于复杂。如果您的参数为null,则b.account_id上没有过滤条件,因为该值将与其自身匹配,或者空值将通过变为0并因此相等。

您可以选择以下内容:

AND b.account_id = COALESCE(account_id_, b.account_id)
AND (account_id_ IS NULL OR b.account_id = account_id_)

两者都是可移植的语法,但我倾向于使用COALESCE以避免OR在可能的情况下因为维护和可攻击性而受到关注。