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。
有什么好主意吗?
答案 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
在可能的情况下因为维护和可攻击性而受到关注。