在 Oracle 中处理 NULL

Dealing with NULLs in Oracle

我有一个使用 :CONTRACT_TYPE 过滤的查询。我的 contract_type 包含空值和整数。

我似乎无法正确处理空值,如果我执行以下操作,我会 return 0 个结果:

 WHERE CONTRACT_TYPE = NVL(:CONTRACT_TYPE, CONTRACT_TYPE) 

只要我这样做,我就会得到我想要的结果:

WHERE CONTRACT_TYPE is null

我希望能够传入 NULLS 和整数的 :CONTRACT_TYPE

谢谢大家:)

为了获得空值和非空值的匹配结果,您可以尝试

WHERE decode(:CONTRACT_TYPE, CONTRACT_TYPE, 1) = 1 

通常很简单

WHERE 
   (:CONTRACT_TYPE is not null and CONTRACT_TYPE = :CONTRACT_TYPE)
 or 
   (:CONTRACT_TYPE is null and CONTRACT_TYPE is null) 

工作正常。 但有时当 or_expansion/use_concat 不起作用时,您可能会遇到次优执行计划的问题。 在这种情况下,手动 or-expansion 使用 union all 可能会有所帮助:

select ... from t where  (:CONTRACT_TYPE is not null and CONTRACT_TYPE = :CONTRACT_TYPE)
union all
select ... from t where  (:CONTRACT_TYPE is null and CONTRACT_TYPE is null) 

或者还有另一种方法 - 使用部分记录的函数 sys_op_map_nonnull: 在 sys_op_map_nonnull(CONTRACT_TYPE) 上创建 function-based 索引并在您的谓词中使用它:

where sys_op_map_nonnull(CONTRACT_TYPE) = sys_op_map_nonnull(:CONTRACT_TYPE)